¿Alguien puede explicar con simples Inglés sobre las diferencias entre printf
, fprintf
y sprintf
con ejemplos?
¿En qué corriente está?
Estoy realmente confundido entre estos tres al leer sobre "Manejo de archivos en C".
¿Alguien puede explicar con simples Inglés sobre las diferencias entre printf
, fprintf
y sprintf
con ejemplos?
¿En qué corriente está?
Estoy realmente confundido entre estos tres al leer sobre "Manejo de archivos en C".
Respuestas:
En C, un "flujo" 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 FILE
tipo contiene información sobre la secuencia. Normalmente, no se mete con FILE
el contenido de un objeto directamente, simplemente le pasa un puntero a las diversas rutinas de E / S.
Hay tres flujos estándar: 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 generalmente se refieren a su consola, aunque puede redirigirlos 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
apunta 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 en cualquier lugar donde apunte actualmente la secuencia de salida estándar.
sprintf
escribe texto formateado en una matriz de char
, en lugar de una secuencia.
printf
salidas a la secuencia de salida estándar ( stdout
)
fprintf
va a un identificador de archivo ( FILE*
)
sprintf
va a un búfer que asignaste. ( char*
)
printf ("formato", args) se utiliza para imprimir los datos en la salida estándar, que a menudo es un monitor de computadora.
sprintf (char *, "format", args) es como printf. En lugar de mostrar la cadena formateada en la salida estándar, es decir, un monitor, almacena los datos formateados en una cadena señalada por el puntero de caracteres (el primer parámetro). La ubicación de la cadena es la única diferencia entre printf y la sintaxis de sprint.
fprintf (FILE * fp, "format", args) es como printf nuevamente. Aquí, en lugar de mostrar los datos en el monitor o guardarlos en alguna cadena, los datos formateados se guardan en un archivo al que apunta el puntero de archivo que se usa como el primer parámetro para fprintf. El puntero de archivo es la única adición a la sintaxis de printf.
Si se utiliza el archivo stdout como primer parámetro en fprintf, su funcionamiento se considera equivalente al de printf.
printf(...)
es equivalente a fprintf(stdout,...)
.
fprintf
se usa para enviar a la transmisión.
sprintf(buffer,...)
se usa para formatear una cadena en un búfer.
Tenga en cuenta que también hay vsprintf
, vfprintf
yvprintf
v
sabores no son estándar, creo
v
sabores están ciertamente en el estándar C.
También puede hacer cosas muy útiles con la función vsnprintf ():
$ 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)
vsnprintf
es una función no estándar. La mayoría de las implementaciones que he visto implementan esto o algo similar, pero es específico de la implementación.
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: escribe datos formateados en una cadena de caracteres en la memoria en lugar de stdout
La sintaxis de sprintf es:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Aquí,
La cadena se refiere al puntero a un búfer en la memoria donde se escribirán los datos.
Formato se refiere al puntero a una cadena de caracteres que define el formato.
Cada elemento es una variable o expresión que especifica los datos a escribir.
El valor devuelto por sprintf es mayor o igual a cero si la operación es exitosa o, en otras palabras, el número de caracteres escritos, sin contar el carácter nulo final, se devuelve y devuelve un valor menor que cero si ocurrió un error.
printf: imprime en stdout
La sintaxis para printf es:
printf format [argument]…
La única diferencia entre sprintf () y printf () es que sprintf () escribe datos en una matriz de caracteres, mientras que printf () escribe datos en stdout, el dispositivo de salida estándar.