au sujet de l'intérêt des bonnes pratiques
Cette réponse dérive du la discussion " Problème lecture d'un fichier de 500 Ko
Citation:
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).
Citation:
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++.
Code:
ifstream fdat.open("mon_fichier.txt",ios::binary);
Francois
au sujet de l'intérêt des bonnes pratiques
Cette discussion a été ouverte comme digression de la question portant sur la lecture de fichier
message original
Citation:
Envoyé par
fcharton
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!
Le fait est que, venant du C, on a vite fait d'assimiler un char* à... une chaine de caractères (comprend: de caractères "imprimables", composée d'un tableau de caractères terminé par '\0')
Je veux pour preuve de cette affirmation la toute récente discussion tableau d'element hexa tronqué qui n'est qu'une illustration supplémentaire (le problème se pose très régulièrement) de la confusion si facile à faire en C ;)
Citation:
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.
Il ne s'agit pas de dénigrer le C, qui est un langage que j'utilise moi même souvent, mais simplement d'attirer l'attention aussi souvent que possible sur le fait que:
- oui, C++ hérite du C, et propose, de ce fait, toute la palette des possibilités issue du C mais
- non, il ne faut pas considérer C++ comme "du C avec des classes" ( C with classes)
- il est possible de trouver une possibilité propre à C++ qui sera généralement bien plus simple, sécurisante et facile à lire à l'ensemble pour quasi la totalité des possibilités issues du C
Citation:
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.
Je connais bien la différence entre un fichier dit (d'ailleurs de manière erronnée) "binaire" (que l'on devrait plutôt qualifier de "fichier contenant des données brutes) et un fichier que l'on qualifie volontiers de "fichier texte"...
Je sais aussi que l'extension n'a a priori rien à voir avec le contenu réel du fichier.
Par contre, je te rappelle que le but de l'extension est, sommes toutes, de permettre à l'utilisateur, et dans une certaine mesure au système d'exploitation, de déterminer avec quelle application ouvrir le fichier...
Or, classiquement, un fichier portant l'extension *.txt sera ouvert avec... un éditeur de texte "simple" (bloc note sous windows, gedit, nano, emacs ou similaire sous linux) qui vont considérer chaque byte comme étant... des caractères exclusivement.
Et c'est là qu'apparait le problème de l'ouverture du fichier:
Si tu essaye de gérer le contenu d'un fichier de type dit "texte" en tant que données brutes, ou celui d'un fichier de type dit "binaire" en tant que caractères, tu t'expose à un tas de problème: tes entiers qui ne dépasseront jamais 9999 ou des bips et autres caractères cabalistiques (dans le meilleur des cas), selon le cas ;)
Citation:
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.
Je n'en disconvient pas, mais rien dans la question de Youry ne donne la moindre information nous permettant d'envisager seulement que ce fut le cas...
Dans le doute, il est donc important de lui permettre de donner des précisions sur le sujet, et, le fait de lui indiquer l'incohérence "ressentie" entre son code et ses explications est une possibilités (peut être pas la meilleure :aie:) pour l'inciter à apporter des précisions ;)
Citation:
Envoyé par
ptyxs
D'autres que moi, plus expérimentés, répondront sans doute de façon plus élaborée et argumentée. Cela dit, il me semble que tu fais complètement fausse route : si les outils du C sont disponibles en C++ c'est avant tout pour permettre une compatibilité avec du code antérieur existant et en aucune façon parce que cela serait recommandé ou souhaitable de les utiliser dans des programmes nouveaux lorsque ce n'est pas indispensable pour une raison bien précise.
Quant aux pointeurs et tableaux, ils constituent une des difficultés et sources d'erreur majeure du C et un des avantages du C++ c'est de permettre de les éviter dans un grand nombre de cas et de construire ainsi du code plus lisible, plus facile à maintenir et moins 'error-prone', ce qui est un des objectifs majeurs du C++
Citation:
Envoyé par
JolyLoic
L'idée n'est pas de dire que ce n'est pas standard, mais de dire que si le but est de faire du C++, il y a des alternatives supérieures.
ptyxs et JolyLoic mis le doigt sur le but de mon intervention...
Il faut bien comprendre, fcharton, que nous sommes visiblement en présence de quelqu'un qui:- débute en C++
- n'a qu'une connaissance parcellaire du C
( @ Youry : il ne faut pas te sentir agressé par cette phrase: nous sommes tous passés par là, et ce n'est une constatation finalement assez objective de la situation ;))
Or, s'il y a une seule série de pièges à c** dans lequel tous les programmeurs devront, s'ils doivent répondre honnêtement, avouer être tombés à un moment ou un autre en C, c'est, très clairement, ceux qui concernent la gestion de pointeurs, de l'allocation dynamique et de fuites mémoire.
Et je sais par expérience qu'il est d'autant plus difficile d'abandonner une (mauvaise) habitude qu'elle a été pratiquée longtemps ;)
Dés lors, il est presque de notre devoir de donner les bonnes habitudes "aussi vite que possible", et ca passe par celle... de ne pas utiliser l'allocation dynamique de la mémoire si on peut l'éviter ;)