Quelqu'un peut -il expliquer en anglais simple sur les différences entre printf, fprintfet sprintfavec 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, fprintfet sprintfavec 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 FILEtype contient des informations sur le flux. Normalement, vous ne jouez pas FILEdirectement 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: stdinun pointeur vers le flux d'entrée standard, stdoutun pointeur vers le flux de sortie standard et stderrun 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, stdinpointe maintenant vers inputfile.dat, stdoutpointe vers output.txtet stderrpointe 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, vfprintfetvprintf
vsaveurs ne sont pas standard je crois
vsaveurs 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)
vsnprintfs'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.