[C++]Editeur hexa - comment gérer le EOF
Résolu/Fermé
A voir également:
- [C++]Editeur hexa - comment gérer le EOF
- Editeur hexa - Télécharger - Édition & Programmation
- Editeur html - Télécharger - HTML
- Éditeur de vidéo windows - Guide
- Editeur de registre - Guide
- Gerer les profils netflix - Guide
8 réponses
Bon OK ça m'embête mais on dirait qu'il va falloir que je travaille en C... dommage avec tous les beaux outils fournis par iostream.h. J'avais notamment trouvé que pour "lire" les espaces (de code 0x20 je crois), il fallait utiliser c = fichier.get() au lieu de fichier >> c.
Et puis avec fread, comment ferais-tu pour faire une boucle jusqu'à la fin du fichier ? Tu me parles de la taille du fichier, mais je ne sais pas trop comment faire...
Et puis avec fread, comment ferais-tu pour faire une boucle jusqu'à la fin du fichier ? Tu me parles de la taille du fichier, mais je ne sais pas trop comment faire...
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 déc. 2006 à 19:20
19 déc. 2006 à 19:20
Salut.
C'est là que j'ai buté aussi : comment connaitre la taille du fichier?
faut regarder dans les propriétés, mais je n'en sai pas plus.
Il doit bien y avoir une fonction en C++, ça serait etrange sinon. Mais laquelle?
C'est là que j'ai buté aussi : comment connaitre la taille du fichier?
faut regarder dans les propriétés, mais je n'en sai pas plus.
Il doit bien y avoir une fonction en C++, ça serait etrange sinon. Mais laquelle?
Ben t'aurais pu me dire comment on ouvre le fichier en binaire ! ^^
donc oui ça fonctionne ; par contre comme je ne travaille que sur certains fichiers, je sais quelle est la taille maximale que mon tableau aura, donc je mets
int tab[taille_max].
D'ailleurs je pense que ça n'influence même pas trop le programme : s'il s'arrête, c'est bien parce que j'ai mis l'instruction
if (fichier.eof()) break;
donc oui ça fonctionne ; par contre comme je ne travaille que sur certains fichiers, je sais quelle est la taille maximale que mon tableau aura, donc je mets
int tab[taille_max].
D'ailleurs je pense que ça n'influence même pas trop le programme : s'il s'arrête, c'est bien parce que j'ai mis l'instruction
if (fichier.eof()) break;
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 déc. 2006 à 08:45
19 déc. 2006 à 08:45
Salut.
Ce que je vais dire est soumis à réserve, c'est ce qu'il me semble comprendre après avoir rencontrer des problèmes similaires au tien.
Lorsque tu utilise "iostream et les flux" tu ouvre ton fichier en mode ASCII. C'est à dire que tu lis les donnés par paquets et qu'elle sont interprétés comme un char (qui au final n'est rien de plus qu'un entier)
Le problème c'est que certain caractères code non pas pour des caractères mais pour des commandes (retour à la ligne, tabulation...) et en particulier : EOF
Si tu as un fichier qui n'est pas du texte, et qui est succeptible de contenir n'importe où une suite de données intéerpréter comme un EOF, la seul solution que j'ai trouvé, c'est d'ouvrir le fichier en binaire.
à ce moment là, il faut récupérer la taille du fichier et arréter la lecture lorsque la taille totale est atteinte.
à ma connaissance, la seul fonction capable de lire en binaire est fread.
Voilà, en espérant que ça t'aide.
Ce que je vais dire est soumis à réserve, c'est ce qu'il me semble comprendre après avoir rencontrer des problèmes similaires au tien.
Lorsque tu utilise "iostream et les flux" tu ouvre ton fichier en mode ASCII. C'est à dire que tu lis les donnés par paquets et qu'elle sont interprétés comme un char (qui au final n'est rien de plus qu'un entier)
Le problème c'est que certain caractères code non pas pour des caractères mais pour des commandes (retour à la ligne, tabulation...) et en particulier : EOF
Si tu as un fichier qui n'est pas du texte, et qui est succeptible de contenir n'importe où une suite de données intéerpréter comme un EOF, la seul solution que j'ai trouvé, c'est d'ouvrir le fichier en binaire.
à ce moment là, il faut récupérer la taille du fichier et arréter la lecture lorsque la taille totale est atteinte.
à ma connaissance, la seul fonction capable de lire en binaire est fread.
Voilà, en espérant que ça t'aide.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai trouvé ce qu'il me fallait pour ne pas considérer 0x1A comme le signal EOF : il faut en fait préciser au flux qu'on lit en binaire en utilisant ios::binary. Ce qui donne :
/****************************************************************************** /* LECTURE : renvoie une édition hexadécimale d'un fichier /* Entrées : nom du fichier, tableau de réception des octets /* Sorties : taille du tableau, (tableau modifié) /*****************************************************************************/ long int lecture(char *nom, int *x) { unsigned char c; // caractère int hex; // code hexa de ce caractère long int n=0; // pour la taille du tableau ifstream fichier(nom, ios::in|ios::binary); // BINARY IMPORTANT ! if (!fichier) { cerr << "Erreur lors de l'ouverture de " << nom << endl; exit(1); } for(;;) { c = fichier.get(); x[n] = c; if (fichier.eof()) break; n++; } return n; }
mamiemando
Messages postés
33407
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
29 novembre 2024
7 806
18 déc. 2006 à 01:12
18 déc. 2006 à 01:12
Pour moi un eof c'est un eof... Note que tu peux différemment un fichier avec des trucs genre fread...
Et bien en fait j'aimerais bien utiliser une instruction du C++ ; tout le code est fait avec l'outil iostream et les flux, et donc je préferais ne pas avoir à passer par l'intermédiraire de fread.
D'autant plus que je ne saurais pas comment faire avec fread pour dire "donne-moi tout le contenu du fichier, et pas plus" (sous-entendu, va jusqu'en EOF).
Ah et puis fread me donne des char, et moi j'aimerais des unsigned char convertis en int pour mon éditeur hexa, et je n'y ai pas réussi avec fread...
D'autant plus que je ne saurais pas comment faire avec fread pour dire "donne-moi tout le contenu du fichier, et pas plus" (sous-entendu, va jusqu'en EOF).
Ah et puis fread me donne des char, et moi j'aimerais des unsigned char convertis en int pour mon éditeur hexa, et je n'y ai pas réussi avec fread...
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
21 déc. 2006 à 09:28
21 déc. 2006 à 09:28
Salut.
c'est ce que je te disait.
Par contre, ça fonctionne? il s'arrete? parceque moi, il continuait une foi arriver à la fin du fichier, et du coup ça me donnait une erreur de memoire.
c'est ce que je te disait.
Par contre, ça fonctionne? il s'arrete? parceque moi, il continuait une foi arriver à la fin du fichier, et du coup ça me donnait une erreur de memoire.