[C++]Editeur hexa - comment gérer le EOF

Résolu/Fermé
Tyraniek - 17 déc. 2006 à 16:38
 Tyraniek - 21 déc. 2006 à 15:34
Bonjour à tous !

Je suis en train de créer un semblant d'éditeur hexa ; et certaines valeurs ne passent pas... En particulier, dès que la valeur 0x1A est présente dans le fichier scanné, mon programme s'arrête car je lui ai dit d'arrêter de scanner le fichier lorsqu'il rencontre le caractère de fin de fichier EOF (de code hexa 0x1A).
Comment faire donc pour différencier l'octet 0x1A du caractère EOF ? Ca doit bien être faisable puisque les éditeurs hexa ne buggent pas lorsqu'ils doivent afficher 1A ^^
Si ça peut aider, voici mon code :

unsigned char c;
long int n=0;
ifstream fichier(nom, ios::in);
for(;;)
{
	c = fichier.get();
	x[n] = c;
	if (fichier.eof()) break;
	n++;
}
A voir également:

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...
1
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
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?
1
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;
1
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
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.
0

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;
}
0
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
Pour moi un eof c'est un eof... Note que tu peux différemment un fichier avec des trucs genre fread...
-1
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...
-1
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
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.
-1