¿Diferencia entre fprintf, printf y sprintf?

7 minutos de lectura

avatar de usuario
Vishwanath Dalvi

¿Alguien puede explicar en inglés simple sobre las diferencias entre printf, fprintfy sprintf con ejemplos?

¿En qué corriente está?

Estoy realmente confundido entre los tres mientras leo sobre “Manejo de archivos en C”.

  • Experimente con ellos escribiendo un código de muestra. Esa es una manera muy fácil de claramente entender la diferencia entre ellos.

    – Nawaz

    7 de enero de 2011 a las 15:56

  • Prefiere snprintf() a sprintf() para evitar desbordamientos de búfer tontos.

    – Máximo Egorushkin

    07/01/2011 a las 16:00

  • Prefiere streams o formateadores Boost para evitar desbordamientos de búfer tontos y errores desagradables de inseguridad de tipo

    – John Dibling

    7 de enero de 2011 a las 16:09

  • @Maxim, mientras plantea un punto válido, tomaré la seguridad de saber que mis búferes no se desbordarán y explotarán mi aplicación en pedazos. Solo miraría estas funciones si se demostrara que los formateadores de secuencias/boost están causando cuellos de botella notables. 🙂

    – Muu-jugo

    7 de enero de 2011 a las 16:17

  • @Maxim: el punto es que no hay necesidad. Mi código no es un cuello de botella. 5 m/s es la cantidad de mensajes que envía el intercambio, no la cantidad que somos capaces de procesar. Entonces, ¿por qué optimizar prematuramente?

    – John Dibling

    7 de enero de 2011 a las 16:58


avatar de usuario
Juan Bode

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 disco, a una tubería, a su terminal oa algún otro dispositivo como una impresora o tty. los FILE type contiene información sobre la secuencia. Normalmente, no te metes con un FILE el contenido del objeto directamente, solo 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 suelen hacer referencia a tu consola, aunque puedes 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 puntos a output.txty stderr puntos a errors.txt.

fprintf escribe texto formateado en el flujo de salida que especifique.

printf es equivalente a escribir fprintf(stdout, ...) y escribe texto formateado en donde esté apuntando actualmente el flujo de salida estándar.

sprintf escribe texto formateado en una matriz de chara diferencia de una corriente.

  • “es simplemente un productor (flujo de entrada) o consumidor (flujo de salida) de bytes”. ¿Son estos al revés? ¿No crearía (salida) algo un productor? Pregunto porque realmente no lo sé.

    – Dave Voyles

    06/03/2017 a las 22:02

  • @DaveVoyles: Estos son desde la perspectiva de su programa. Un flujo de entrada produce bytes para que los lea su programa; un flujo de salida consume los bytes producidos por su programa.

    – Juan Bode

    06/03/2017 a las 23:52


  • para cualquiera que esté pensando en lo que f el prefijo/sufijo es para. Inicialmente pensé que la f en printf / sprintf / scanf medio expediente. Pero solo significa formato.

    – mfaani

    17 de marzo de 2021 a las 13:10


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

fprintf va a un identificador de archivo (FILE*)

sprintf va a un búfer que usted asignó. (char*)

avatar de usuario
rubal

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

correr(char *, “formato”, argumentos) 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 a la que apunta el puntero char (el primer parámetro). La ubicación de la cadena es la única diferencia entre la sintaxis de printf y sprint.

fprintf(ARCHIVO *fp, “formato”, args) es como printf de nuevo. 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 primer parámetro para fprintf. El puntero de archivo es la única adición a la sintaxis de printf.

Si salida estándar file se usa como el primer parámetro en fprintf, su funcionamiento se considera equivalente al de printf.

avatar de usuario
VGE

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

fprintf se utiliza para la salida a la corriente.

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

Tenga en cuenta que también hay vsprintf, vfprintf y vprintf

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)

  • +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.

    – John Dibling

    7 de enero de 2011 a las 16:38

  • @larsmans menciona arriba que esto es, de hecho, una parte del estándar C, así que lo retiro

    – John Dibling

    7 de enero de 2011 a las 16:39

  • ¿Qué tiene que ver esto con C?

    – una masa

    7 de enero de 2011 a las 17:05

avatar de usuario
chux – Reincorporar a Monica

imprimir

  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 archivos.

fprintf

  1. El fprintf se utilizó para realizar la operación de escritura en el archivo al que apunta el identificador de ARCHIVO.
  2. la sintaxis es fprintf (filename, "control string ", argument );
  3. Está asociado con la entrada/salida de archivos.

  • +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.

    – John Dibling

    7 de enero de 2011 a las 16:38

  • @larsmans menciona arriba que esto es, de hecho, una parte del estándar C, así que lo retiro

    – John Dibling

    7 de enero de 2011 a las 16:39

  • ¿Qué tiene que ver esto con C?

    – una masa

    7 de enero de 2011 a las 17:05

avatar de usuario
Fahad Alí

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

La sintaxis de sprintf es:

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

Aquí,

String 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 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 de terminación que se devuelve y devuelve un valor menor a cero si ocurrió un error.

printf: Imprime a la salida estándar

La sintaxis de 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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad