1

Salut à tous
Je dois programmer une routine qui lis tous les caractères un après l'autre dans un fichier.
Ce fichier ça peut être n'importe quel fichier, y compris des fichiers qui peuvent contenir le caractère ascii de code 0 (caractère nul ou \0, ce qui arrive souvent d'ailleurs).
Le problème c'est que avec les primitives fopen et compagnie, c'est interpreté comme la fin du fichier, donc ça le lis pas jusqu'à la fin si il rencontre ce foutu caractère avant.
Je sais pas comment faire pour lire un fichier qui contient ces caractères dans ce cas.
Quelqu'un a une idée ?
Merci

2

1. Tu ouvres le fichier en mode binaire.
2. Tu utilises fread, pas fgets.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Mais c exactement ce que je fais, regarde :
char buf[1];
FILE* fd;
if( (fd = fopen("C:\temp.tmp", "rb")) == NULL )
MessageBox(0,"Erreur lors de l'ouverture du fichier","Erreur",MB_OK | MB_ICONEXCLAMATION);
else
{
for(long i=0;i<longueur;i++)
{
if (fread(buf,1,1,fd))
tableau[buf[0]]++;
}
fclose(fd);
}

Tu peux tester en mettant un caractère nul dans un fichier avant la fin, il le lira pas, enfin là en tout cas ça marche pas.

4

-

5

ok merci bcp Orion, je vais tester dès que possible

6

juste une précision à propos du code que tu ne comprennais pas (tableau[buf[0]]++), c'est en fait une routine qui est censée lire dans un fichier caractère par caractère et incrémenter, puis incrémenter dans un tableau de 255 caractères la valeur correspondant au code ascii du caractère :
caractère -> code Ascii -> tableau[codeAscii]++ avec tableau de type long* qui pointe sur un tableau de 255 long

7

Deux trucs :

1 -> le caractere NULL ne sert pas de terminaison a un fichier, quelqu'il soit, il ne sert que de terminaison au chaines de caractere


2 -> ton code est faux, dans le sens ou tu fait un for de i=0 a longueur, mais longueur ?? il est egal a quoi ?? comment peut tu savoir la taille du fichier a l'avance ??????

Tu a deux choix possible soit :

while(!feof(fd))
{
// Code de copie
}


soit :

fseek(fd,0,SEEK_END);
longueur=ftell(fd);
fseek(fd,0,SEEK_SET);
for(i=0 ; i<longueur ; i++)
{
// Code de copie
}


Orion: Dans certain cas le fread(buf,longueur,1,fd) risque de foirer surtout si le fichier est long, mieux vaut copier bloc par boc que tout d'un coup
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

8

-

9

oui mais quand le programme est compilé, c pas aisé de changer le #define roll wink
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.