and - printf c++
Diferencia entre fprintf, printf y sprintf? (8)
¿Alguien puede explicar en inglés simple las diferencias entre printf
, fprintf
y sprintf
con ejemplos?
¿En qué corriente está?
Estoy realmente confundido entre los tres al leer sobre "Manejo de archivos en C".
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 de 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á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 hacen referencia 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 dondequiera que esté apuntando la corriente de salida estándar.
sprintf
escribe texto formateado en una matriz de caracteres, a diferencia de una secuencia.
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)
printf
- printf se usa para realizar salida en la pantalla.
- sintaxis =
printf("control string ", argument );
- No está asociado con la entrada / salida de archivo
fprintf
- El fprintf que utilizó para realizar la operación de escritura en el archivo apuntado por el controlador FILE.
- La sintaxis es
fprintf (filename, "control string ", argument );
- Está asociado a la entrada / salida de archivos
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í,
Cadena se refiere al puntero a un búfer en la memoria donde se escribirán los datos.
El 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 para escribir.
El valor devuelto por sprintf es mayor o igual a cero si la operación es exitosa o, en otras palabras, se devuelve el número de caracteres escritos, sin contar el carácter nulo de terminación, y devuelve un valor menor que cero si se produce 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.
fprintf
Esto está relacionado con las secuencias donde printf
es una declaración similar a fprintf
pero no está relacionada con las secuencias, es decir, fprintf
está relacionado con archivos
printf(...)
es equivalente a fprintf(stdout,...)
.
fprintf
se usa para dar salida a la transmisión.
sprintf(buffer,...)
se usa para formatear una cadena en un buffer.
Tenga en cuenta que también hay vsprintf
, vfprintf
y vprintf
printf
salidas a la corriente de salida estándar ( stdout
)
fprintf
va a un manejador de archivo ( FILE*
)
sprintf
va a un buffer 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 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 el archivo stdout se utiliza como el primer parámetro en fprintf, su funcionamiento se considera equivalente al de printf.