Quelqu'un peut -il expliquer en anglais simple sur les différences entre printf
, fprintf
et sprintf
avec des exemples?
Dans quel flux est-il?
Je suis vraiment confus entre les trois lors de la lecture de "Gestion des fichiers en C".
Quelqu'un peut -il expliquer en anglais simple sur les différences entre printf
, fprintf
et sprintf
avec des exemples?
Dans quel flux est-il?
Je suis vraiment confus entre les trois lors de la lecture de "Gestion des fichiers en C".
Réponses:
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. Il peut correspondre à un fichier sur disque, à un canal, à votre terminal ou à un autre périphérique tel qu'une imprimante ou un terminal. Le FILE
type contient des informations sur le flux. Normalement, vous ne jouez pas FILE
directement avec le contenu d' un objet, vous lui passez simplement un pointeur vers les différentes routines d'E / S.
Il existe trois flux standard: stdin
un pointeur vers le flux d'entrée standard, stdout
un pointeur vers le flux de sortie standard et stderr
un pointeur vers le flux de sortie d'erreur standard. Dans une session interactive, les trois se réfèrent généralement à votre console, bien que vous puissiez les rediriger pour pointer vers d'autres fichiers ou appareils:
$ myprog < inputfile.dat > output.txt 2> errors.txt
Dans cet exemple, stdin
pointe maintenant vers inputfile.dat
, stdout
pointe vers output.txt
et stderr
pointe vers errors.txt
.
fprintf
écrit du texte formaté dans le flux de sortie que vous spécifiez.
printf
équivaut à écrire fprintf(stdout, ...)
et écrit du texte formaté là où le flux de sortie standard pointe actuellement.
sprintf
écrit du texte formaté dans un tableau de char
, par opposition à un flux.
printf ("format", args) est utilisé pour imprimer les données sur la sortie standard qui est souvent un écran d'ordinateur.
sprintf (char *, "format", args) est comme printf. Au lieu d'afficher la chaîne formatée sur la sortie standard, c'est-à-dire un moniteur, il stocke les données formatées dans une chaîne pointée par le pointeur char (le tout premier paramètre). L'emplacement de la chaîne est la seule différence entre la syntaxe printf et sprint.
fprintf (FILE * fp, "format", args) est à nouveau 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 qui est 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 dans fprintf, son fonctionnement est alors considéré comme équivalent à celui de printf.
printf(...)
est équivalent à fprintf(stdout,...)
.
fprintf
est utilisé pour sortir en streaming.
sprintf(buffer,...)
est utilisé pour formater une chaîne dans un tampon.
Notez qu'il y a aussi vsprintf
, vfprintf
etvprintf
v
saveurs ne sont pas standard je crois
v
saveurs sont très certainement dans la norme C.
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)
vsnprintf
s'agit d'une fonction non standard. La plupart des implémentations que j'ai vues implémentent ceci ou quelque chose comme ça, mais c'est spécifique à l'implémentation.
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
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:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Ici,
La chaîne fait référence au pointeur vers un tampon en mémoire où les données doivent être écrites.
Le format fait référence au 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 réussit ou en d'autres termes le nombre de caractères écrits, sans compter le caractère nul de fin est renvoyé et renvoie une valeur inférieure à zéro en cas d'erreur.
printf: imprime vers la sortie standard
La syntaxe de printf est:
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.