2011-01-07 17 views
140

¿Alguien puede explicar en inglés simple las diferencias entre printf, fprintf y sprintf con ejemplos?Diferencia entre fprintf, printf y sprintf?

¿Qué transmisión es?

Estoy realmente confundido entre los tres al leer sobre "Manejo de archivos en C".

+4

Experimenta con ellos escribiendo algún código de muestra. Esa es una manera muy fácil de * entender * claramente la diferencia entre ellos. – Nawaz

+13

Prefiere snprintf() a sprintf() para evitar los desbordamientos tontos de la memoria intermedia. –

+3

Prefiere transmisiones o formateadores Boost para evitar desbordamientos tontos de búfer y desagradables errores tipo-inseguridad –

Respuesta

169

En C, una "corriente" es una abstracción; desde la perspectiva del programa, es simplemente un productor (flujo de entrada) o consumidor (flujo de salida) de bytes. Puede corresponder a un archivo en el disco, a una tubería, a su terminal, o a algún otro dispositivo como una impresora o tty. El tipo FILE contiene información sobre la transmisión. Normalmente, no se entromete con los contenidos de un objeto FILE directamente, simplemente le pasa un puntero a las diversas rutinas de E/S.

Hay tres flujos estándares: stdin es un puntero al flujo de entrada estándar, stdout es un puntero al flujo de salida estándar y stderr es un puntero al flujo de salida de error estándar. En una sesión interactiva, los tres por lo general se refieren a la consola, aunque se puede redirigir para que apunten a otros archivos o dispositivos:

$ myprog <inputfile.dat> output.txt 2> errors.txt 

En este ejemplo, stdin ahora apunta a inputfile.dat, stdout puntos a output.txt, y stderr apunta a errors.txt.

fprintf escribe texto formateado en la secuencia de salida que especifique.

printf es equivalente a escribir fprintf(stdout, ...) y escribe texto formateado dondequiera que esté apuntando la corriente de salida estándar.

sprintf escribe texto formateado en una matriz de char, en contraposición a una secuencia.

+1

"es simplemente un productor (flujo de entrada) o consumidor (flujo de salida) de bytes". ¿Están al revés? ¿Un productor no podría crear (producir) algo? Preguntar porque realmente no lo sé. –

+3

@DaveVoyles: Estos son desde la perspectiva de su programa. Una secuencia de entrada produce bytes para que su programa lea; una secuencia de salida consume los bytes producidos desde su programa. –

+0

"Estos son desde la perspectiva de su programa". Eso lo aclaró, ¡gracias! –

19

printf(...) es equivalente a fprintf(stdout,...).

fprintf se utiliza para enviar a transmisión.

sprintf(buffer,...) se utiliza para formatear una cadena en un búfer.

en cuenta también es vsprintf, vfprintf y vprintf

+0

Los sabores 'v' no son estándar. Creo que –

+8

Los sabores' v' están muy bien en el estándar C. –

+0

@larsmans: ah, vale. gracias por la corrección. Esta pregunta fue en un punto etiquetada [C++] –

117

printf salidas al flujo de salida estándar (stdout)

fprintf va a un identificador de archivo (FILE*)

sprintf va a un búfer que asignado. (char*)

2

También puede hacer cosas muy útiles con vsnprintf() Función:

$ cat test.cc 
#include <exception> 
#include <stdarg.h> 
#include <stdio.h> 

struct exception_fmt : std::exception 
{ 
    exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3))); 
    char const* what() const throw() { return msg_; } 
    char msg_[0x800]; 
}; 

exception_fmt::exception_fmt(char const* fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    vsnprintf(msg_, sizeof msg_, fmt, ap); 
    va_end(ap); 
} 

int main(int ac, char** av) 
{ 
    throw exception_fmt("%s: bad number of arguments %d", *av, ac); 
} 

$ g++ -Wall -o test test.cc 

$ ./test 
terminate called after throwing an instance of 'exception_fmt' 
    what(): ./test: bad number of arguments 1 
Aborted (core dumped) 
+0

+1 útil de hecho, pero tenga en cuenta que 'vsnprintf' es una función no estándar. La mayoría de las implementaciones que he visto implementan esto o algo parecido, pero es específico de la implementación. –

+1

@larsmans menciona anteriormente que esto es, de hecho, una parte del estándar C, así que lo retomo –

+2

¿Qué tiene esto que ver con C? – onemasse

0

fprintf Esto se relaciona con las corrientes donde como printf es una declaración similar a fprintf pero no relacionadas con las corrientes, es decir fprintf es archivo relacionado

0

sprintf: escribe datos con formato a una cadena de caracteres en la memoria en lugar de la salida estándar

sintaxis de sprintf es:

#include <stdio.h> 
int sprintf (char *string, const char *format 
[,item [,item]…]); 

Aquí,

Cadena se refiere al puntero a un búfer en la memoria donde se escribirán los datos.

El formato hace referencia al puntero a una cadena de caracteres que define el formato.

Cada elemento es una variable o expresión que especifica los datos para escribir.

El valor devuelto por sprintf es mayor o igual a cero si la operación tiene éxito, o en otras palabras, el número de caracteres escritos, sin contar que se devuelve el carácter nulo de terminación y devuelve un valor menor que cero si se ha producido un error .

printf: imprime a la salida estándar

Sintaxis para printf es:

printf format [argument]… 

La única diferencia entre sprintf() y printf() es que sprintf() escribe datos en un array de caracteres, mientras que printf() escribe datos en stdout, el dispositivo de salida estándar.

2

printf

  1. printf se utiliza para realizar la salida en la pantalla.
  2. sintaxis = printf("control string ", argument);
  3. No está asociado con la entrada/salida de archivo

fprintf

  1. El fprintf se utiliza para realizar la operación de escritura en el archivo apuntado por identificador de archivo.
  2. La sintaxis es fprintf (filename, "control string ", argument);
  3. Se asocia con la entrada/salida de archivo
+0

Si se cita de otro lugar, es mejor citar la fuente con un enlace, pero sin embargo, mantener el texto que se ha citado aquí. – SuperBiasedMan

15

printf ("formato", args) se utiliza para imprimir los datos en la salida estándar, que es a menudo un monitor de ordenador .

sprintf (char *, "formato", args) es como printf. En cambio, al mostrar la cadena formateada en la salida estándar, es decir, un monitor, almacena los datos formateados en una cadena apuntada por el puntero char (el primer parámetro). La ubicación de la cadena es la única diferencia entre la sintaxis printf y sprint.

fprintf (FILE * fp, "formato", args) es como printf nuevamente.Aquí, en cambio, al mostrar los datos en el monitor o guardarlos en alguna cadena, los datos formateados se guardan en un archivo apuntado por el puntero de archivo que se usa como primer parámetro para fprintf. El puntero del archivo es la única adición a la sintaxis de printf.

Si stdout archivo se utiliza como primer parámetro en fprintf, su funcionamiento se considera equivalente al de printf.

Cuestiones relacionadas