web-dev-qa-db-fra.com

Différence entre fprintf, printf et sprintf?

Quelqu'un peut-il expliquer en anglais simple les différences entre printf, fprintf et sprintf à l'aide d'exemples?

Dans quel flux est-il?

Je suis vraiment confus entre les trois en lisant à propos de "Gestion des fichiers en C".

181
mr_eclair

En C, un "flux" est une abstraction; du point de vue du programme, il s'agit simplement d'un producteur (flux d'entrée) ou d'un consommateur (flux de sortie) d'octets. Cela peut correspondre à un fichier sur le disque, à un tuyau, à votre terminal ou à un autre périphérique tel qu'une imprimante ou un terminal. Le type FILE contient des informations sur le flux. Normalement, vous ne jouez pas directement avec le contenu d'un objet FILE, vous lui passez simplement un pointeur sur les diverses routines d'E/S. 

Il existe trois flux standard: stdin est un pointeur sur le flux d'entrée standard, stdout est un pointeur sur le flux de sortie standard et stderr est un pointeur sur le flux de sortie d'erreur standard. Dans une session interactive, les trois font généralement référence à votre console, bien que vous puissiez les rediriger pour pointer vers d'autres fichiers ou périphériques:

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

Dans cet exemple, stdin pointe maintenant sur inputfile.dat, stdout pointe sur output.txt et stderr pointe sur errors.txt

fprintf écrit du texte mis en forme dans le flux de sortie que vous spécifiez. 

printf équivaut à écrire fprintf(stdout, ...) et écrit du texte mis en forme à l'endroit où le flux de sortie standard pointe actuellement.

sprintf écrit du texte formaté dans un tableau de char, par opposition à un flux. 

205
John Bode

printf sorties vers le flux de sortie standard (stdout)

fprintf va à un handle de fichier (FILE*)

sprintf va dans un tampon que vous avez alloué. (char*)

135
Moo-Juice

printf ("format", arguments) est utilisé pour imprimer les données sur la sortie standard, qui est souvent un écran d'ordinateur. 

sprintf (char *, "format", args) est semblable à printf. Au lieu d'afficher la chaîne formatée sur la sortie standard, c'est-à-dire un moniteur, les données formatées sont stockées dans une chaîne pointée par le pointeur de caractère (le tout premier paramètre). L'emplacement de la chaîne est la seule différence entre les syntaxes printf et sprint.

fprintf (FILE * fp, "format", args) est comme printf. Ici, au lieu d'afficher les données sur le moniteur ou de les enregistrer dans une chaîne, les données formatées sont enregistrées dans un fichier pointé par le pointeur de fichier utilisé comme premier paramètre de fprintf. Le pointeur de fichier est le seul ajout à la syntaxe de printf.

Si le fichier stdout est utilisé comme premier paramètre de fprintf, son fonctionnement est alors considéré comme équivalent à celui de printf.

24
Rubal

printf(...) est équivalent à fprintf(stdout,...).

fprintf est utilisé pour générer un flux.

sprintf(buffer,...) est utilisé pour formater une chaîne dans un tampon.

Notez qu'il y a aussi vsprintf, vfprintf et vprintf

20
VGE

printf

  1. printf est utilisé pour effectuer une sortie à l'écran.
  2. syntaxe = printf("control string ", argument );
  3. Il n'est pas associé à l'entrée/sortie de fichier

fprintf

  1. Le fprintf utilisé pour effectuer l’écriture dans le fichier pointé par le descripteur FILE.
  2. La syntaxe est fprintf (filename, "control string ", argument );
  3. Il est associé au fichier entrée/sortie
2
Amit Vasava

Vous pouvez également faire des choses très utiles avec la fonction 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)
2
Maxim Egorushkin

fprintf Ceci est lié aux flux où printf est une instruction similaire à fprintf mais non liée aux flux, c'est-à-dire que fprintf est lié au fichier.

0
kavamsi12

sprintf: écrit des données formatées dans une chaîne de caractères en mémoire au lieu de stdout

La syntaxe de sprintf est la suivante:

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

Ici,

Chaîne fait référence au pointeur sur un tampon en mémoire où les données doivent être écrites.

Format désigne un pointeur sur une chaîne de caractères définissant le format.

Chaque élément est une variable ou une expression spécifiant les données à écrire.

La valeur renvoyée par sprintf est supérieure ou égale à zéro si l'opération aboutit ou, en d'autres termes, au nombre de caractères écrits. Le caractère nul final est renvoyé et renvoie une valeur inférieure à zéro en cas d'erreur.

printf: imprime sur stdout

La syntaxe pour printf est la suivante:

printf format [argument]…

La seule différence entre sprintf () et printf () est que sprintf () écrit des données dans un tableau de caractères, tandis que printf () écrit des données sur stdout, le périphérique de sortie standard.

0
Fahad Ali