292 votes

Différence entre fprintf, printf et sprintf ?

Quelqu'un peut-il expliquer en anglais simple les différences entre printf , fprintf et sprintf avec des exemples ?

Dans quel courant se trouve-t-il ?

Je suis vraiment confus entre les trois en lisant "File Handling in C".

4 votes

Expérimentez-les en écrivant quelques exemples de code. C'est une façon très simple de clairement comprendre la différence entre eux.

21 votes

Préférez snprintf() à sprintf() pour éviter les stupides débordements de tampon.

3 votes

Préférez les flux ou les formateurs Boost pour éviter les débordements de tampon et les bogues de non sécurité de type.

291voto

John Bode Points 33046

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 le disque, à un tube, à votre terminal ou à un autre périphérique tel qu'une imprimante ou un tty. Le site FILE contient des informations sur le flux. Normalement, on ne s'embarrasse pas d'un type FILE directement le contenu de l'objet, vous passez simplement un pointeur sur celui-ci aux différentes routines d'E/S.

Il existe trois flux standard : stdin est un pointeur vers le flux d'entrée standard, stdout est un pointeur vers le flux de sortie standard, et stderr est un pointeur vers le flux de sortie de l'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 indique maintenant inputfile.dat , stdout Les points suivants output.txt et stderr Les points suivants errors.txt .

fprintf écrit du texte formaté dans le flux de sortie que vous spécifiez.

printf est équivalent à écrire fprintf(stdout, ...) et écrit le texte formaté à l'endroit où le flux de sortie standard pointe actuellement.

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

5 votes

"c'est simplement un producteur (flux d'entrée) ou un consommateur (flux de sortie) d'octets." Est-ce que c'est à l'envers ? Un producteur ne devrait-il pas créer (sortir) quelque chose ? Je pose la question parce que je ne sais vraiment pas.

8 votes

@DaveVoyles : Ils 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 par votre programme.

4 votes

Pour tous ceux qui pensent que le f préfixe/suffixe est pour. J'ai d'abord pensé que le f sur printf / sprintf / scanf signifie fichier . Mais cela signifie simplement format .

191voto

Moo-Juice Points 22190

printf sort sur le flux de sortie standard ( stdout )

fprintf va vers un handle de fichier ( FILE* )

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

29voto

VGE Points 2969

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

fprintf est utilisé pour sortir vers le flux.

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

Notez qu'il existe également vsprintf , vfprintf et vprintf

1 votes

Le site v les saveurs ne sont pas standard je crois

10 votes

Le site v Les saveurs sont très certainement dans la norme C.

1 votes

@larsmans : ah, ok. Merci pour la correction. Cette question était à un moment donné étiquetée [c++].

3voto

Maxim Yegorushkin Points 29380

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)

0 votes

+1 utile en effet, mais sachez que vsnprintf est une fonction non standard. La plupart des implémentations que j'ai vues l'implémentent ou quelque chose comme ça, mais c'est spécifique à l'implémentation.

1 votes

@larsmans mentionne ci-dessus que cela fait en fait partie du standard C, donc je retire ce que j'ai dit.

2 votes

Qu'est-ce que ça a à voir avec C ?

0voto

kavamsi12 Points 1

fprintf Ceci est lié aux flux où printf est une déclaration similaire à fprintf mais sans rapport avec les flux, c'est-à-dire fprintf est lié à un fichier

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X