Lire toutes les chaines d'un fichier

Signaler
Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015
-
Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015
-
Salut,
J'ai fait un programme qui charge toutes les chaines séparées par des espaces, et la boucle for ne se termine jamais, car la dèrnière chaine se lit à l'infini.

Code :
char Chaines[1000][255];
FILE *fp;
fp=fopen("fichier.txt","r");
for(int i=0;strcmp(temp,"");i++)
{
fscanf("%s",&temp);
}
fclose(fp);

5 réponses

Messages postés
19
Date d'inscription
lundi 9 octobre 2000
Statut
Membre
Dernière intervention
23 juin 2002

Si tu veux quil ny est plus de boucle infini il faut que tu testes la fin du fichier avec EOF
Messages postés
129
Date d'inscription
dimanche 9 décembre 2001
Statut
Membre
Dernière intervention
12 janvier 2009

Re !
Je ne sais pas ou tu as trouvé ta boucle for avec la comparaison, mais tu ne pourra jms avoir un code qui marche en faisant ca !
Dans le cas d'un fchier, tu ne c pas quelle est sa longueur !
Or, par définition, une boucle FOR se répète un nombre défini de fois ! c pas ce que tu ve !
Comm je te l'ai dit pour l'otre mess, utilise une boucle WHILE !

et pour tester si tu est a la fin du fichier, c'est FEOF
regarde la doc pour ces fonctions, et tu verra que tu va trouver ton bonheur !
A+
NICO !
Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015

En fait, il me refait une boucle infinie !

Mon code :

FILE *fp,*fp2;
char tmp[1];
char temp[255];
int count=0,i=0;
fp=fopen("test.txt","r");
fp2=fopen("test.txt","w");
while(feof(fp)==0)
{
count++;
}
sprintf(temp,"Nombre d'octets : %d",count);
MessageBox(temp,"",MB_OK);
while(i<count)
{
fread(tmp,sizeof( char ),1,fp);
fwrite(tmp,sizeof( char ),1,fp2);
i++;
}
fclose(fp);
fclose(fp2);
Messages postés
129
Date d'inscription
dimanche 9 décembre 2001
Statut
Membre
Dernière intervention
12 janvier 2009

Salut !
Ton idée est pas con, mais j'ai encore des critiques a faire !
Dans ton code, tu fé 2 boucle, ce qui te fé 2 fois plus de temps !
La première ne sert qu'a vérifier la taille du fichier, et pour ca, y'a des fonctions pour ca !
Par exemple, tu utilise fseek pour déplacer le curseur a la fin du fichier, puis ftell pour savoir a quel nombre d'octets se trouve ton curseur !

Ensuite, si tu connais la taille de ton fichier, alors tu pe utiliser une boucle for !
Tu va dire que je me contredit ! mais pas du tout ! c juste que ton idée consiste a chercher la taille du fichier avant de le copier ! alors que par habitude (et c le cas pour bcp de monde), on utilise le fichier direct, sans regarder sa taille avant !

Je suis fétigué ce soir, mais je vé t'écrire un morceo de code qd mm !

avec ta méthode :

FILE *fp,*fp2;
char tmp; // tu n'a besoin que d'1 char, ne fé pas un tableo
char temp[255];
int count=0,i=0;
fp=fopen("test.txt","r");
fp2=fopen("test.txt","w");

fseek(fp,0,SEEK_END); //place le curseur a la fin du fichier
count=ftell(fp); // récupère le nombre d'octets
fseek(fp,0,SEEK_SET); // replace le cureseur au début du fichier

sprintf(temp,"Nombre d'octets : %d",count);
MessageBox(temp,"",MB_OK);
for (i=0;i<count;i++)
{
fread(&tmp,1,1,fp);
fwrite(&tmp,1,1,fp2);
}
fclose(fp);
fclose(fp2);

Autre solution :

FILE *fp,*fp2;
char tmp[100];
fp=fopen("test.txt","rb");
fp2=fopen("test.txt","wb");

int n;
{
n = fread(tmp,1,100,fp);
fwrite(tmp,1,n,fp2);
}while ( !feof(fp) );

fclose(fp);
fclose(fp2);

J'ai pas testé ! mais ca doit marcher !
Tu va me demander pk j'utilise un N, et pk j'ai mis le while a la fin !
Pour le N, c juste qu'au lieu de lire 1 seul octet a la fois, j'en lis 100 ! mais comme le fichier n'a pas forcément une taille multiple de 100, la fonction fread, te renvoi le nombre d'octets qu'elle a pu lire ! donc, dans fread, je lui écrit le mm nombre qu'elle a lu ! sinon, c pas bon !
Pour le while a la fin, c juste pour évitre de passer 2 fois le dernier bloc du fichier ! tu verra si tu teste !

j'ai rajouter un B, sur les fopen, pour ouvrir les fichier en binaire, histoire de ne pas être influencé par les caractères autres que alphanumériques !

Voilà !
Fini pour ce soir !

A+
NICO !

PS : amuse toi bien ! j'ai taper tout ca au pif ! alors y'a peut-être des erreurs !
Messages postés
67
Date d'inscription
vendredi 28 décembre 2001
Statut
Membre
Dernière intervention
23 juin 2015

Merci :)
Bonne nuit :)