Cette réponse dérive du la discussion " Problème lecture d'un fichier de 500 Ko

Envoyé par
koala01
Mais, par pitié, sur le forum C++, la première chose à faire, c'est de veiller à donner des solutions C++...
Cela signifie que dés que l'on remarque FILE, fread, fwrite, fopen, fclose ou même char* (plus toutes les choses auxquelles je ne pense pas), il faut tirer un signal d'alarme et bien faire comprendre à la personne qu'il travaille en C.
Les lectures à base de FILE sont effectivement des héritages du C, mais tous les compilateurs C++ (que je connais) les reconnaissent, les acceptent, et les fournissent dans leurs bibliothèques standard. Si on va par là, c'est plus standard que Boost...
Quant à char*, quelle drôle d'idée!
FILE appartient au C++, tout comme "football" est un mot français d'origine anglaise. L'utiliser pour lire des fichiers, c'est sans doute pas très standard (comme on parle un français "non standard" dans plein de régions du monde), mais de là à "tirer un signal d'alarme"?
Ca me rappelle ces parisiens qui se moquent des marseillais, ou des québecois, parce qu'ils trouvent qu'ils parlent mal français.
(Et non, je n'utilise pas FILE, je préfère les fstream, et oui je suis parisien).

Envoyé par
koala01
D'un coté, tu utilises un fichier dont l'extension est en *.txt, ce qui fait penser que tu utilise un fichier considéré comme étant un fichier contenant... du texte (des chaines de caractères, en fait), et de l'autre, tu ouvre ton fichier en mode "binaire", ce qui fait penser que tu souhaite gérer le contenu du fichier comme ... des données brutes...
Mode binaire ou mode texte, ca dépend essentiellement de la façon dont les fichiers sont structurés, pas des données qu'ils contiennent ou de leur utilisation future (et encore moins de leur extension).
En mode texte, on s'attend à voir des lignes de longueur variables, séparées par des retours à la ligne, et parfois des séparateurs intermédiaires. On lit ligne à ligne (ou champ à champ) sans se préoccupper de la position où l'on se trouve, et on fait en général des getline, qui lisent jusqu'au prochain délimiteur. A chaque lecture, ces délimiteurs sont supprimés: l'utilisateur n'y a jamais accès.
En mode binaire, on doit spécifier, à chaque lecture, le nombre d'octets qu'on lit. Ceci est donc adapté à des fichiers où les champs ou les enregistrements sont de longueur fixe (mais qui peuvent parfaitement contenir des chaines de texte). Et on utilisera alors des read. Ces positions fixes permettront également plus facilement de se déplacer dans le fichier sans le lire avec des seekg par exemple.
Le choix entre mode texte et mode binaire ne dépend pas de la nature ou de l'utilisation qu'on va faire des données, mais seulement de la façon dont elles sont organisées dans le fichier. Un grand nombre de fichiers textes sont formattés "en ASCII colonné", et se lisent en mode binaire.
En pratique, la lecture en more binaire est toujours plus rapide que le mode texte: un read n'a pas besoin de contrôler la présence de délimiteurs, on peut allouer ses tailles de structures unitaires de lecture à l'avance, etc...
Et, une fois de plus, ca n'a pas grand chose à voir avec le C: on fera en C++.
ifstream fdat.open("mon_fichier.txt",ios::binary);
Francois
Partager