Petite aide en C
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.
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.
Configuration: Windows XP Firefox 2.0.0.16
30 réponses
Résumé de la discussion
Le problème décrit concerne un programme C qui lit trois fichiers et tente de comparer la première ligne de test1 et test2 pour copier la ligne identique dans test3. La meilleure réponse suggère de fermer le fichier3 après l'écriture et de le rouvrir en mode lecture pour lire la ligne copiée; elle conseille aussi de supprimer l'inclusion <cstring> et d'éviter l'inclusion inutile. Elle recommande en outre d'utiliser une boucle pour lire plusieurs lignes jusqu'à EOF et d'éviter les appels superflus comme fgets dans des endroits inappropriés. D'autres remarques évoquent des ajustements pratiques sur l'ouverture des fichiers et la synchronisation entre écriture et lecture pour éviter les lectures incomplètes.</cstring>
-
hum.. ba au final je n'ai pas réussi a lire plus d'une ligne =/
merci de votre aide :D-
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
-
-
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 :) -
litalib ?
-
http://www.litalib.com
-
Je ne vois pas où insérer ma boucle while :x
-
Merci oupsman :) ( et mype et 00julien00 bien sur :d )
je vais tester cela :D -
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
-
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 =/ -
non un tableau a une dimension suffit mais il faudrait faire une boucle si tu veut comparer chaque ligne des deux fichiers
-
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 -
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. -
Sélestat, près de strasbourg, Alsace tkt :D
-
MERCIII :DD
testons maintenant :) -
juste comme sa tu habite dans quelle ville ?
-
bon je vois pas l'utilité de ta lib cstring...
tu ferme ton fichier 3 apres l'ecriture puis te le reouvre avant de le lire
comme çaif (strcmp(chaine1,chaine2) == 0) { printf("Chaine1 = Chaine2 \n\n"); fprintf(fichier3, "%s", chaine2); fclose(fichier3); fichier3 = fopen("test3.txt","r"); 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(); -
Je ne sais pas =/
J'ai jamais testé code block =( -
j'utilise code block peut étre que...
mon debuger me di qu'il y a une érreur dans #include <cstring> -
j'apprend :D
non pas moyen sa marche pas -
Non si tu es pas dedans normal que tu comprennes pas..
xp
sa marche aussi si tu compiles sans le <cstring> en vrai. -
euh.....bon la tu doit te dire p**** y comprent rien ce gar :p
- 1
- 2
Suivant