Lire toutes les chaines d'un fichier

Jmgr Messages postés 67 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 23 juin 2015 - 27 janv. 2002 à 18:01
Jmgr Messages postés 67 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 23 juin 2015 - 28 janv. 2002 à 20:38
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

header Messages postés 19 Date d'inscription lundi 9 octobre 2000 Statut Membre Dernière intervention 23 juin 2002
27 janv. 2002 à 19:50
Si tu veux quil ny est plus de boucle infini il faut que tu testes la fin du fichier avec EOF
0
MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009
27 janv. 2002 à 20:35
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 !
0
Jmgr Messages postés 67 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 23 juin 2015
28 janv. 2002 à 09:42
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);
0
MangaII Messages postés 129 Date d'inscription dimanche 9 décembre 2001 Statut Membre Dernière intervention 12 janvier 2009
28 janv. 2002 à 20:32
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jmgr Messages postés 67 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 23 juin 2015
28 janv. 2002 à 20:38
Merci :)
Bonne nuit :)
0
Rejoignez-nous