Petite aide en C

heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -  
oupsman Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voila, j'ai un problème dans un programme en C.

J'ai trois fichiers :

Un fichier nommé " test1" ( contient une ligne ou est marqué: " un " )
Un second nommé "test2" ( contient pareil que le fichier 1 )
Un troisième nommé "test3" vierge.

Je souhaite comparer les lignes 1 des fichiers 1 et 2 et, si elles sont identiques, mettre la ligne 1 du fichier 2 dans le document 3.

Voici mon code :

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <cstring>

#define TAILLE_MAX 1000 // Tableau de taille 1000


int main(int argc, char *argv[])
{
int i = 1;
FILE* fichier1 = NULL;
FILE* fichier2 = NULL;
FILE* fichier3 = NULL;
char chaine1[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
char chaine2[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
char chaine3[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX

fichier1 = fopen("test1.txt", "r+");
fichier2 = fopen("test2.txt", "r+");
fichier3 = fopen("test3.txt", "r+");
if (fichier1 != NULL)
{
printf("fichier1 ouvert\n");

if (fichier2 != NULL)
{
if (fichier3 != NULL)
{

printf("fichier2 ouvert \n\n");

fgets(chaine1, TAILLE_MAX, fichier1); // On lit maximum TAILLE_MAX caractères du fichier1, on stocke le tout dans "chaine1"
printf("Ligne %d du fichier 1 : %s\n", i,chaine1); // On affiche la chaîne1

fgets(chaine2, TAILLE_MAX, fichier2); // On lit maximum TAILLE_MAX caractères du fichier2, on stocke le tout dans "chaine2"
printf("ligne %d du fichier 2 : %s\n\n", i,chaine2); // On affiche la chaîne2



if (strcmp(chaine1,chaine2) == 0)
{
printf("Chaine1 = Chaine2 \n\n");
fprintf(fichier3, "%s", chaine2);

fgets(chaine3, TAILLE_MAX, fichier3); // On lit maximum TAILLE_MAX caractères du fichier3, on stocke le tout dans "chaine3"
printf("ligne %d du fichier 3 : %s\n\n", i,chaine3); // On affiche la chaîne3
getchar();

}
else //if ((strcmp(chaine1,chaine2) < 0)
{
printf("Chaine1 != Chaine2\n\n");
}
i++;

getchar();

fclose(fichier1);
fclose(fichier2);
fclose(fichier3);
}
}
}

return 0;
}


Tout marche, les fichiers sont ouverts, on les lit, on les compare.

Mais le soucis, est que je n'arrive pas a copier la ligne 1 du fichier 2 dans le fichier 3 comme voulu..

De plus, comment faire pour lire plusieurs lignes dans les fichiers ?


Qui pourrais m'aider car je ne trouve pas ce qui ne vas pas..

Merci a vous.

30 réponses

juliano
 
http://www.litalib.com
0
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
WAIIIII BRAVO TU ASSURES :D


Ton pti code à marché :DD


Une dernière question si vous avez le temps, comment faire pour lire une seconde ligne ?

un tableau avec [i][j] ?

Merci Merci :D
-1
oupsman Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   10
 
salut,

pour lire une seconde ligne et même jusqu'à la n-ième ligne, il suffit d'utiliser une boucle while.

while( (fscanf(....)) != EOF)
{
je compare chaque ligne de chaque fichier ... etc
}
-1
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
non un tableau a une dimension suffit mais il faudrait faire une boucle si tu veut comparer chaque ligne des deux fichiers
-1
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Hum..

Quelque chose du genre :

for ( i=0; i<NB_LIGNES;i++)
{
//traitemement
}

?

Mais je ne comprend pas comment cela permet de changer de ligne =/
-1

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

Posez votre question
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
ben c'est un curseur qui se deplace sur chaque caractere de ton fichier donc sa position avance au fur et a mesure que tu lis dedans quand il arrive au caractere '\n' de fin de ligne il passe a la ligne suivante tout seul
-1
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Merci oupsman :) ( et mype et 00julien00 bien sur :d )

je vais tester cela :D
-1
oupsman Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   10
 
pas de quoi, tiens nous au jus
-1
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Je ne vois pas où insérer ma boucle while :x
-1
oupsman Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   10
 
la boucle while c'est juste apres avoir ouvert tes trois fichiers.

J'ouvre mes trois fichiers, tant que je n'arrive pas en fin de fichier ( càd EOF), je lis ligne par ligne et je compare.
-1
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
litalib ?
-1
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Yeahh

je vois des réponses comme celles de mc auquelles je n'ai pas répondu :x

Apparement elles se sont pas affichées correctement =/

mc :


Si je comprends bien ton probleme est le suivant

fprintf(fichier3, "%s", chaine2); => ecrit dans le fichier
fgets(chaine3, TAILLE_MAX, fichier3); => lit dans ce meme fichier
printf("ligne %d du fichier 3 : %s\n\n", i,chaine3); => affiche ce qui vient d'etre lu

Et BAM! rien n'a été ecrit à l'écran..... c'est normal docteur! il faut imaginer le fichier comme une bande sur laquelle on dispose un curseur. A l'ouverture, ce curseur est au debut du fichier. Lors de l'ecriture il avance et se retrouve donc a la fin des choses que tu viens d'ecrire. Ensuite la lecture intervient, mais ou est le curseur? a la fin, donc il n'y a rien a lire, donc aucun affichage. Si j'etais toi, je verifierais si rien ne se trouve dans le fichier (en l'ouvrant a la main, et en verifiant a l'oeuil). Normalement les donnees doivent etre la.


merci pour ton aide :)
-1
heroux67 Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
hum.. ba au final je n'ai pas réussi a lire plus d'une ligne =/

merci de votre aide :D
-1
oupsman Messages postés 316 Date d'inscription   Statut Membre Dernière intervention   10
 
En fait, si je comprend bien ton problème, tu veux comparer ligne par ligne les trois fichiers.

Je ne sais pas comment est-ce que tu l'as codé mais si j'étais à ta place voici mon algo :

primo je défini la fonction int CompareLigne(char * ligne1, char * ligne2);
cette fonction renvoi 1 si les deux lignes sont identiques, sinon elle renvoi 0.(c'est une fonction pas très simple car il faut que tu compares caractères par caractères donc faisant appel à d'autres sous-fonctions que tu concevras)


secondo en supposant que tu as conçu la première étape, tu applique cette fonction sur les trois fichiers en même temps comme je te l'ai expliqué :

{
...
int n=1;
char *ligne1, *ligne2, *ligne3;

ouverture des 3 fichiers en mode "r" (pour read).

while(fscanf(fichier1, "%s", ligne1) != EOF)
{
if( (CompareLigne(ligne1, fscanf(fichier2, "%s", ligne2) == 0) || (CompareLigne(ligne1, fscanf(fichier3, "%s", ligne3) == 0))/*des qu'il y a au moins une ligne qui n'est pas identique a l'une des 2 autres*/
{
printf("\nUne des lignes n'est pas identique\n");
exit(0);/*ou return 0, en tout cas on a le resultat voulu*/
}
printf("\nLes trois lignes des %d -ieme lignes des fichiers sont identiques \n", n);
n++;
}
exit(0); /*ou return 0, c'est à toi de voir ce qui te convient mais on sort du programme*/
}



Voilà, cet algo marche à priori
-1