Problème avec fwrite

cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005 - 23 juin 2005 à 10:48
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005 - 24 juin 2005 à 10:17
bonjour

j'ai un petit problème avec fwrite, en fait je voudrais tout simplement
recopier les données d'un fichier 1 dans un fichier 2 seulement si ces
données n'existent pas dans fichier2

voici le code que j'ai pondu:



int main()

{

int value,taille;

FILE *fp;

FILE *fp1;

char *test;

char command[100];



test = (char*)malloc(sizeof(char));



fp = fopen("fichier1","r");

fp1 = fopen("fichier2","a");

while(!feof(fp))

{

fgets(test,10,fp);

taille = ftell(fp);

sprintf(command,"grep "%s" fichier1", test);

if(system(command))

{

fwrite(test,sizeof(char),taille,fp1);

}

}

fclose(fp);

fclose(fp1);

return 0;

}



-voici le contenu du fichier1 :

salut

hello

bonjour



-le fichier fichier2 est vide au début



et voila ce que j'obtiens, dans test1.txt, lorsque je lance le programme:

salut

hello^@^@^@ibonjour



je ne sais pas pourquoi il apparait ces caractères en plus.

Autre problème ne connaissant pas à l'avance la taille d'une ligne du
fichier1, je voulais mettre une valeur élévée (1000) pour fgets mais
ceci me génère un segmentation fault.

j'espère que vous pourrez m'aider.

merci d'avance

11 réponses

cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 11:16
j'ai trouvé la soluce c'était un peu con désolé

il fallait que je soustrais la taille de la ligne précedente à cahque nouvelle ligne



while(!feof(fp))

{

fgets(test,10,fp);

taille = ftell(fp);

taille = taille - taille1;

sprintf(command,"grep "%s" fichier1, test);

if (system(command))

{

fwrite(test,sizeof(char),taille,fp1);

}

taille1 = taille1 + taille;

}
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
23 juin 2005 à 11:21
ton grep, tu ne devrais pas plutot le faire sur "fichier2"?
sprintf(command,"grep "%s" fichier1", test) -> sprintf(command,"grep "%s" fichier2", test);


et aussi :



test = (char*)malloc(sizeof(char));

en faisant ca, si je ne dis pas de betise, tu alloue un seul caractere non?

tu devrais plutôt faire test = (char*)malloc(100 * sizeof(char))
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
23 juin 2005 à 11:22
ah trop tard lol :)
0
cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 11:24
tu as raison pour le grep j'avais pas fait gaff merci bien
0

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

Posez votre question
cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 11:26
par contre j'ai un autre problème maintenant, j'ai bien toute les
informations ds fichier2 mais elles sont toutes attachées, il n'y a pas
de saut de ligne
0
cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 15:28
autre pb (décidement) j'arrive le programme fonctionne bien lorsque le
fichier 2 est vide mais si jamais le fichier2 contient qqchose, le
programme ne rajoute qu'une seule ligne au fichier 2 (malgré qu'il y
est plusierus ligne ds fichier1 qui ne soient pas ds fichier2);
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
23 juin 2005 à 16:05
j'ai l'impression que tu lis les caractères un à un

Si c'est le cas, il ne passe jamais a la ligne puisque '\n' il le trouve dans le fichier 2



Tu devrais essayer de mettre :



test = (char*)malloc(100 * sizeof(char);



voir si ca marche mieux



(oublie pas de liberer a la fin)



tiens moi au courant
0
cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005
23 juin 2005 à 16:08
j'ai essayé mais ca marche nikel qd le fichier 2 est vide mais qd il
contient déjà qqchose il prend une ligne au "pif" ds fichier 1 et le
balance ds fichier2
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
24 juin 2005 à 08:04
vérifie que grep te renvoie le bon truc

J'ai l'impression que tu as inversé des paramètres
0
cs_riep Messages postés 7 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 24 juin 2005
24 juin 2005 à 09:02
voici ce que me donne la ligne de grep:

grep "salut

" fichier2

grep "hello

" fichier2

grep "bonjour" fichier2

je sais pas pourquoi il va à la ligne qd c'est des mots qui ne sont pas à la fin du fichier.
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
24 juin 2005 à 10:17
C'est normal, c'est parce que quand il lit ton fichier, il lit les \n de passage a la ligne, et les enregistre



Tu as trois solutions :



1/ tu lis ligne par ligne ton fichier1, en eliminant le \n

2/ plutôt q'utiliser une commande système, tu recherche directement
dans ton programme (par exemple en lisant tout d'abord ton fichier2, et
en enregistrant dans un tableau les lignes lues, puis en cherchant dans
celles-ci)

3/ Tu te mets au C++ et aux flux, qui te simplifieront la vie.



A toi de voir, tu as plein d'autres solutions encore

Mias pour ma part, je n'utiliserais pas grep, parce que :

1/ ce n'est pas portable

2/ C'est brutal comme truc, t'auras du mal a faire evoluer ton programme par la suite

Je pense que le mieux serait la solution 2 (sauf si tu veux te mettre au C++)



Bon courage,

Darfeuille
0
Rejoignez-nous