Essayez-les en écrivant un exemple de code. C'est un moyen très facile de comprendre clairement la différence entre eux.
Nawaz
14
Préférez snprintf () à sprintf () pour éviter les débordements idiots de tampon.
Maxim Egorushkin du
3
Préférez les flux ou les formateurs Boost pour éviter les débordements de tampons idiots et les bogues de type non sûrs
John Dibling
7
@Maxim, pendant que vous soulevez un point valable, je prendrai la sécurité en sachant que mes tampons ne vont pas déborder et exploser mon application en morceaux. Je ne regarderais ces fonctions que si les formateurs de flux / boost étaient à l'origine de goulots d'étranglement notables. :)
Moo-Juice
1
@Maxim: Le fait est qu'il n'y a pas besoin. Mon code n'est pas un goulot d'étranglement. 5 m / s est le nombre de messages que l'échange envoie, pas le nombre que nous sommes capables de traiter. Alors pourquoi optimiser prématurément?
John Dibling
Réponses:
238
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:
"c'est simplement un producteur (flux d'entrée) ou un consommateur (flux de sortie) d'octets." Est-ce à l'envers? Un producteur ne créerait-il pas (sortie) quelque chose? Demander parce que je ne sais vraiment pas.
Dave Voyles
6
@DaveVoyles: Ce sont du point de vue de votre programme. Un flux d'entrée produit des octets que votre programme peut lire; un flux de sortie consomme les octets produits à partir de votre programme.
John Bode
153
printfsorties vers le flux de sortie standard ( stdout)
fprintfva à un descripteur de fichier ( FILE*)
sprintfva à un tampon que vous avez alloué. ( char*)
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.
+1 utile en effet, mais sachez qu'il 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.
John Dibling
1
@larsmans mentionne ci-dessus que c'est en fait une partie de la norme C, donc je reprends cela
John Dibling
2
Qu'est-ce que cela a à voir avec C?
2011
2
printf
printf est utilisé pour effectuer la sortie sur l'écran.
syntaxe = printf("control string ", argument );
Il n'est pas associé à l'entrée / sortie de fichier
fprintf
Le fprintf utilisé pour effectuer une opération d'écriture dans le fichier pointé par le descripteur FILE.
La syntaxe est fprintf (filename, "control string ", argument );
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.
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 pasFILE
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 etstderr
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:Dans cet exemple,
stdin
pointe maintenant versinputfile.dat
,stdout
pointe versoutput.txt
etstderr
pointe verserrors.txt
.fprintf
écrit du texte formaté dans le flux de sortie que vous spécifiez.printf
équivaut à écrirefprintf(stdout, ...)
et écrit du texte formaté là où le flux de sortie standard pointe actuellement.sprintf
écrit du texte formaté dans un tableau dechar
, par opposition à un flux.la source
printf
sorties vers le flux de sortie standard (stdout
)fprintf
va à un descripteur de fichier (FILE*
)sprintf
va à un tampon que vous avez alloué. (char*
)la source
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.
la source
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
la source
v
saveurs ne sont pas standard je croisv
saveurs sont très certainement dans la norme C.Vous pouvez également faire des choses très utiles avec la fonction vsnprintf ():
la source
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 );
la source
fprintf
Ceci est lié aux flux où, commeprintf
une déclaration similairefprintf
mais non liée aux flux, c'est-à-fprintf
dire liée au fichierla source
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:
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:
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.
la source