Bonjour!
Je n'arrive pas a distinguer la difference entre printf, sprintf et fprintf :(
et a quoi set buf (je n'arrive pas a l'assimiler) :(
Merci pour votre aide :)
Version imprimable
Bonjour!
Je n'arrive pas a distinguer la difference entre printf, sprintf et fprintf :(
et a quoi set buf (je n'arrive pas a l'assimiler) :(
Merci pour votre aide :)
setbuf() : Jamais utilisé, donc pour mi, ça ne sert à rien (définition égoîste mais je ne peux pas te dire plus).
sprintf() : Fait une écriture formatée sur un buffer en mémoire (sans vérifier la taille du buffer, hélas). Utile pour faire des trucs avec ensuite, commel l'envoyer sur un réseau ou l'afficher avec des fonctions ne supportant pas l'écriture formatée.
fprintf() : Fait une écriture formatée sur un flux passé en paramètre.
printf() : Pareil, sauf que le flux est toujours stdout.
merci pour la reponse :)
Excuse mon ignorance lol mais c'esy quoi un flux passé en parametre?
et à quoi sert le buf dans le code si dessous?
on veut calculer le nombre de chiffres dans un nombre nb:
int longueur (int nb)
{
char buf[12];
sprintf(buf, "%d", nb);
return strlen(buf);
}
Les flux en C sont des FILE * : Le type retourné par fopen().
stdin, stdout et strerr sont également des flux C.
La fonction effectue un sprintf() vers un buffer en mémoire. Ainsi, le nmobre écrit restera en mémoire au lieu d'être affiché sur la console ou écrit dans un fichier.
Ensuite, l'appel à strlen() mesure la longueur de la chaîne écrite, qui dépend du nombre de chiffres du nombre.
(mais l'appel strlen() est inutile, car la valeur retournée par sprintf() est justement la bonne valeur...)
merci pour l'explication:)
setbuf et setvbuf permettent de fixer soi-même le tampon associé à un flux, voire de désactiver la bufferisation d'un flux. Par défaut, les flux sont associés à des tampons de type bloc, sauf les flux connectés à des terminaux qui reçoivent des tampons de type ligne (à l'exception de stderr qui n'est pas tamponné). Les tampons disposent normalement d'une taille BUFSIZ (constante définie par le système).Citation:
Envoyé par thepinguin
Il est rarement nécessaire de jouer avec ces fonctions (sauf si on aime vivre dangereusement, cf. ci-dessous), car les tampons attribués par le système conviennent la plupart du temps.
Il est cependant possible de modifier tout cela pour certaines applications particulières (par exemple : on peut souhaiter émettre sur la sortie standard des données au rythme où elles sont reçues et traitées, auquel cas il sera nécessaire de supprimer la bufferisation de stdout).
A ce sujet, voici un exemple classique et tout bête d'utilisation de setbuf dans un programme qui copie simplement son entrée standard vers sa sortie standard.
En fait, ce code est FAUX ! Je vous laisse trouver pourquoi...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdlib.h> #include <stdio.h> int main(void) { int c; char buffer[BUFSIZ]; setbuf(stdout, buffer); while ((c = getchar()) != EOF) { putchar(c); } return EXIT_SUCCESS; }
putchar() au lieu de putchar(c) ?
Au temps pour moi Médinoc ! Il s'agit ici d'une erreur de frappe de ma part, je corrige ca dans mon post précédent. La véritable erreur est bien entendu ailleurs.Citation:
Envoyé par Médinoc
D'après le man:Citation:
Envoyé par Corentor
Citation:
Il faut toujours s'assurer que buf et son contenu existent encore au moment de la fermeture du flux (qui se produit automatiquement à la fin du programme).
J'aurais mis buffer à NULL dans ce cas!Citation:
Envoyé par Correntor
En effet:
-> utilisation du mode _IONBF (pas de buffer)Citation:
Si l'argument buf est NULL, seul le mode est affecté.
Oui. Ai-je dit le contraire ? (s'il est question de la variable buffer du code, ce dernier n'avait rien à voir avec cette remarque).Citation:
Envoyé par homeostasie
C'est cela, mais j'aurais aimé une proposition de correction ;) .Citation:
Envoyé par homeostasie