Pb de copie de fichier/taille de structure

Signaler
Messages postés
5
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
29 octobre 2004
-
Messages postés
31
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
3 décembre 2009
-
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

Messages postés
31
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
3 décembre 2009

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)