Petite aide en C

Fermé
heroux67 Messages postés 21 Date d'inscription mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008 - 25 sept. 2008 à 18:39
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 - 26 sept. 2008 à 23:14
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

http://www.litalib.com
0
heroux67 Messages postés 21 Date d'inscription mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 19:40
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 mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
25 sept. 2008 à 19:46
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
25 sept. 2008 à 19:42
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 mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 19:45
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
25 sept. 2008 à 19:56
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 mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 19:58
Merci oupsman :) ( et mype et 00julien00 bien sur :d )

je vais tester cela :D
-1
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
25 sept. 2008 à 20:02
pas de quoi, tiens nous au jus
-1
heroux67 Messages postés 21 Date d'inscription mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 20:08
Je ne vois pas où insérer ma boucle while :x
-1
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
25 sept. 2008 à 20:17
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 mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 20:19
litalib ?
-1
heroux67 Messages postés 21 Date d'inscription mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 20:32
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 mardi 23 septembre 2008 Statut Membre Dernière intervention 6 novembre 2008
25 sept. 2008 à 21:01
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 mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
26 sept. 2008 à 23:14
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