Infos sur les streams

Résolu/Fermé
redirbew Messages postés 6 Date d'inscription vendredi 31 décembre 2021 Statut Membre Dernière intervention 2 août 2024 - 20 avril 2022 à 18:20
redirbew Messages postés 6 Date d'inscription vendredi 31 décembre 2021 Statut Membre Dernière intervention 2 août 2024 - 28 avril 2022 à 14:06
Bonjour,

Je continue ma formation C en autodidacte principalement pour le fun mais aussi par curiosité.

Le livre dont je me sers est en Anglais et j'en suis arrivé aux flux (flux standards et fichiers).

2 phrases m'interpellent, les voici :

A stream pointer refers to a structure that contains information about the corresponding file.

Et

A file can be opened as a stream, ie., a buffer can be associated with a file, by using the function fopen.

J'en viens à me demander ce qu'est réellement un flux. Est-ce un emplacement mémoire (buffer) qui contient le fichier ou est-ce un emplacement mémoire qui contient juste des informations sur le fichier ? Autrement dit, quand j'ouvre un flux, est-ce que le fichier est transféré intégralement en mémoire ou est-ce à moi de le faire avec malloc et fread éventuellement ?

Je pense que c'est juste un descriptif et à moi de faire le buffer mais la 2ème phrase sème le doute dans mon esprit. Quelqu'un peut confirmer ?

Merci!!

redirbew

Configuration: Linux / Firefox 99.0

5 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié le 20 avril 2022 à 20:37
Salut redirbew,

En C, un flux est juste un moyen logique de gérer une entrée ou sortie de données.

Une définition de ce qu'est un flux est donnée par le standard du C

7.21.2 Streams
Input and output, whether to or from physical devices such as terminals and tape drives, or whether
to or from files supported on structured storage devices, are mapped into logical data streams, whose
properties are more uniform than their various inputs and outputs.
(...)


Il y a d'autres types de flux que tu peux gérer avec le C, par exemple la sortie standard (affichage à l'écran), qui est gérée avec le flux stdout.

Les phrases que tu cites parlent d'un flux particulier, qui est celui de gestion des entrées ou sorties sur des fichiers.

7.21.3 Files
A stream is associated with an external file (which may be a physical device) by opening a file, which
may involve creating a new file. (...)


Le standard définit un type (opaque) dénommé FILE pour gérer les entrées ou sorties sur les fichiers.

7.21.1 (...)
FILE
which is an object type capable of recording all the information needed to control a stream, including
its file position indicator, a pointer to its associated buffer (if any), an error indicator that records
whether a read/write error has occurred, and an end-of-file indicator that records whether the end of
the file has been reached


Le standard ne définit pas plus ce que doit être "FILE". On sait juste qu'on doit utiliser ce type pour récupérer un "objet" permettant de gérer le fichier. fopen() renvoie ainsi un
FILE *
.

Si tu veux vraiment savoir, il faut aller voir le code source du compilateur, ce que tu peux faire pour gcc car c'est un logiciel libre et tu vois que pour cette version de gcc.

http://sourceware.org/git/?p=glibc.git%3Ba%3Dblob%3Bf%3Dlibio%2Fstdio.h%3Bh%3D754301fc1abd789700a723fa399fecd3f931dfa2%3Bhb%3DHEAD#l48 pour la définition du typedef FILE
http://sourceware.org/git/?p=glibc.git%3Ba%3Dblob%3Bf%3Dlibio%2Flibio.h%3Bh%3D3cf1712ea98d3c253f418feb1ef881c4a44649d5%3Bhb%3DHEAD#l245 pour la définition de la struct elle-même

Tu vois que FILE est une struct et tu vois les membres de cette struct, dans cette version de gcc.

Ce qui correspond à FILE est susceptible de changer d'une version à l'autre de gcc. C'est l'affaire du concepteur du compilateur que de déterminer ce qu'il y met dès lors que cela permet de gérer le flux conformément au standard du C. On parle de type "opaque", car l'utilisateur n'a pas à savoir ce qui se cache sous le capot, qui dépend de l'implémentation du C par le concepteur du compilateur.

Donc, pour répondre à ta question.

Le fait d'ouvrir un flux en lecture vers un fichier ne va pas charger ce fichier en mémoire, mais te permet de disposer d'un pointeur vers un "objet" FILE qui permet aux fonctions fread(), fgets(), etc. de fonctionner et auxquelles ce pointeur est passé, lesquelles sont destinées à te permettre de récupérer des données dans un espace mémoire (buffer) de ton choix.


Dal

P.S : les citations du standard du C sont tirées du dernier draft du standard C17 en vigueur, qui est là : http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf
1
redirbew Messages postés 6 Date d'inscription vendredi 31 décembre 2021 Statut Membre Dernière intervention 2 août 2024 1
21 avril 2022 à 11:17
Salut Dal,

Merci pour cette réponse extrêmement complète, c'est top !!

Je ne trouvais pas non plus de document complet sur le standard C, dont je vois souvent des citations comme tu l'as fait ici mais sans jamais en trouver la source. Ton P.S. est donc tout à propos !

Excellente journée !! :)))
1
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
21 avril 2022 à 16:47
De rien redirbew,

Tu peux trouver des liens vers les drafts des différentes versions du standard du C ici : https://en.cppreference.com/w/c/links

La lecture est aride. Il faut les prendre comme des documents de référence. Au fil des versions, les documents deviennent aussi de plus en plus longs et moins lisibles. C'est dommage, par rapport au C89 que je trouve très concis. Lorsque je cherche quelque chose, il m'arrive de chercher d'abord dans C89, avant d'attaquer un standard plus récent où je vais me noyer plus facilement.

Sinon, c'est super d'avoir des questions comme les tiennes de temps à autres, qui viennent de personnes qui cherchent vraiment à comprendre ce qui est dit par un enseignant ou écrit dans un manuel. C'est un retour aux sources rafraîchissant qui change des questions "pourquoi çà marche pas" et qui permet de faire le point sur des concepts fondamentaux :-)

Quel est le manuel que tu utilises ?
0
redirbew Messages postés 6 Date d'inscription vendredi 31 décembre 2021 Statut Membre Dernière intervention 2 août 2024 1
26 avril 2022 à 10:20
Je suis câblé de base comme ça, j'essaie de comprendre le pourquoi de presque tout ! ;-) Je sais qu'il faut avancer même quand on ne comprend pas quelque chose, car parfois on comprend plus loin, mais ce n'est pas toujours le cas. Sans certaines compréhensions de base on reste coincé.

Quand tu parles de retour aux sources, tu ne crois pas si bien dire ! J'utilise un livre qui s'appelle "C: An Advanced Introduction" de 1985 ! Et sincèrement je suis stupéfait des concepts déjà élaborés à l'époque, en réalité le changement n'est pas énorme c'est juste ce qu'on en fait et le matériel qui a bien évolué.

Il y a bien sûr le C++ dont on faisait déjà mention dans ce livre de 1985, C++ qui est d'ailleurs mon objectif suivant et le but de mon apprentissage du C (je pense que c'est nécessaire pour appréhender le C++).

C'est sympa d'avoir des gars comme toi qui prennent la peine de répondre aux débutants, c'est ça la passion ! :))

Vraiment merci pour tout, je n'hésiterai pas à revenir sur ce forum si j'ai un nouveau problème de compréhension.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
26 avril 2022 à 21:56
Si ton objectif est d'apprendre le C++, je te déconseille d'apprendre le C en premier. Ces 2 langages ont des points communs dans la syntaxe, mais ils s'utilisent en pensant totalement différemment. Et tu risques d'écrire du C dans du code C++ (que le compilateur acceptera), mais ça sera du très mauvais C++.
Et au moment d'apprendre le C++, qui lui a nettement évolué, penses à utiliser des bouquins récents (au moins depuis 2017).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
redirbew Messages postés 6 Date d'inscription vendredi 31 décembre 2021 Statut Membre Dernière intervention 2 août 2024 1
28 avril 2022 à 14:06
Merci pour ces précieux conseils mais je pense être trop loin dans mon apprentissage du C que pour arrêter maintenant. Je fais ça avant tout pour le fun et connaître le dessous des cartes, il est fort probable que je ne programme jamais rien réellement et en tout cas pas professionnellement donc si ce n'est pas du beau code C++ à cause du C bah ce ne sera pas dramatique à mon sens.

J'ai déjà acheté le livre pour le C++, il est récent et a été écrit par Bjarne Stroustrup (Le langage C++ aux éditions Pearson). Vu l'épaisseur ça a l'air d'être du sérieux ! ;)
0