Pb de copie de fichier/taille de structure

cs_wannie Messages postés 5 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 29 octobre 2004 - 27 juin 2003 à 12:08
vidarusny Messages postés 31 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 3 décembre 2009 - 27 juin 2003 à 14:33
Salut tt le monde.

Quelqu'un pourrai tester mon prog est me dire si ça fonctionne.
Moi je comprend pas j'ai une copie d'un caractère dans chaque ligne du fichier.
Cette appli copie juste une ligne d'un fichier vers un autre:

Code:
#include <stdio.h>

void main(){

typedef struct{
char num[2];
char nom[6];
}ELEVE;

ELEVE eleve;
FILE *fich;
FILE *test;
int num_enr;

fich=fopen("c:\\eleve.dat","wt");
test=fopen("c:\\test.dat","r");

num_enr=0;

while(!feof(test)){
fseek(test,num_enr*sizeof(ELEVE),SEEK_SET);
fread(&eleve,sizeof(ELEVE),1,test);

fwrite(&eleve,sizeof(ELEVE),1,fich);
num_enr++;
}
}

le fichier est de ce type:

Code:
01xxxxxx
02aaaaaa
03zzzzzz
04yyyyyy
05pppppp

et le resultat donne :

Code:
01xxxxxx
02aaaaaaa
03zzzzzzz
04yyyyyyy
005pppppp05pppppp

je pense que ça vien de la structure mai je me casse là tête dessus depuis trois jour et j'ai toujours le même problème.

Merci d'avance pour tt aide.

1 réponse

vidarusny Messages postés 31 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 3 décembre 2009
27 juin 2003 à 14:33
Je l'ai tester et effectivement tu as des caractère en trop. Ca vient de ta fonction :
while(!feof(test)){
fseek(test,num_enr*sizeof(ELEVE),SEEK_SET);
fread(&eleve,sizeof(ELEVE),1,test);

fwrite(&eleve,sizeof(ELEVE),1,fich);
num_enr++;
}
}
En effet tu lit à chaque fois la taille de la structure eleve soit 8 caracteres toutefois t ligne comporte 9 caractere (ne pas oublier le retour chariot).
De même qd tu te positionne tu doit pensez à rajouter 1.
Voila ton code source légèrement modifier:
#include <stdio.h>

void main(){

typedef struct{
char num[2];
//prise en conte du RC
char nom[7];
}ELEVE;

ELEVE eleve;
FILE *fich;
FILE *test;
int num_enr;

fich=fopen("c:\\eleve.dat","wt");
test=fopen("c:\\test.dat","r");

num_enr=0;

while(!feof(test)){
//positionne à la ligne suivante
fseek(test,num_enr*(sizeof(ELEVE)+1),SEEK_SET);
fread(&eleve,sizeof(ELEVE),1,test);
//Une chaine de caractère est plus propre qd le dernier caractere pointe sur null
eleve.num[9]=NULL;
fwrite(&eleve,sizeof(ELEVE),1,fich);
num_enr++;
}
}

Toutefois ton code est limite à ligne des ligne de fichier qui contient uniquement 9 caractere avec le retour chariot (au fait la valeur hexa du retour chariot est 0x0A)
0
Rejoignez-nous