web-dev-qa-db-fra.com

En C, comment imprimer un fichier texte ligne par ligne?

int main()
{
   FILE *infile;
   FILE *infile2;
   char input[255],input2[255];
   int status1, status2;

   infile = fopen("test.txt", "r");
   infile2 = fopen("test2.txt", "r");
   if(infile == NULL)
   {
      printf("Can not open file 1!\n");
   }
   else if(infile2 == NULL)
   {
      printf("Can not open file 2!\n");
   }
   else
   {
      do
      {
        status1 = fscanf(infile, "%s", &input);
        status2 = fscanf(infile2, "%s", &input2);

        printf("File 1: %s\n File 2: %s\n", input, input2);
     }while(status1 != -1 || status2 != -1);
   }
   fclose(infile);
   fclose(infile2);

   return 0;
}

Ma sortie ressemble à ceci:

Sortie

Je voudrais imprimer le fichier 1 sur une ligne, pas Word par Word. La même chose vaut pour file2. Je suis un peu nouveau dans la catégorie C alors je suis coincé.

6

Si vous souhaitez lire toute la ligne, utilisez fgets function au lieu de fscanf:

char *status1, *status2;
   .
   .
   .
do {
    status1 = fgets(input, sizeof(input), infile);
    status2 = fgets(input2, sizeof(input2), infile2);
    printf("File 1: %s File 2: %s", input, input2);
} while (status1 || status2);

Notez que printf n'utilise plus \n. En effet, fgets conserve \n du fichier dans votre chaîne d'entrée.

4
dasblinkenlight

J'ai apporté les modifications au code et cela fonctionne, mais une autre question. Si je voulais comparer les fichiers et écrire la différence dans un nouveau fichier comme celui-ci:

  1. Fichier1: Mon nom est Knut 
  2. File2: Mon nom est KnutAndre
  3. File3: Andre (C'est la différence entre les fichiers).

Mon professeur m'a dit d'utiliser strcmp puis de transférer le résultat dans un nouveau fichier, mais je ne le comprends pas très bien.

Voici à quoi ressemble mon code:

int main()
{

FILE *infile;
FILE *infile2;
FILE *outfile3;
char input[255],input2[255];
char status1, status2;



infile = fopen("test.txt", "r");
infile2 = fopen("test2.txt", "r");

if(infile == NULL)
{
    printf("Can not open file 1!\n");
}
else if(infile2 == NULL)
{
    printf("Can not open file 2!\n");
}
else
{
    do
    {
        status1 = fgets(input, sizeof(input), infile);
        status2 = fgets(input2, sizeof(input2), infile2);

        if(status1 != 0){

        printf("File 1: %s\n\nFile 2: %s\n\n", input, input2);

        int result = strcmp(input, input2);
        printf("\nResult = %d\n\n", result);

        }


    }
    while(status1 || status2);

}
fclose(infile);
fclose(infile2);

return 0;



}
2

Dans mon école, nous créons une fonction get_next_line, qui prend un descripteur de fichier et un pointeur sur une chaîne en paramètre.

vous pouvez jeter un oeil ici: https://github.com/juschaef/libtowel/search?utf8=%E2%9C%93&q=get+next+line

1
albttx

Lorsque vous utilisez la variable fscanf, il ne lira que les caractères jusqu'à ce que le caractère d'espace non blanc apparaisse. Lorsque vous devez obtenir l’entrée sous forme de ligne entière, vous devez utiliser fgets()

De la page man de fgets().

fgets () lit au moins un caractère de taille inférieure à stream et les stocke dans la mémoire tampon indiquée par s. La lecture s'arrête après un EOF ou une nouvelle ligne. Si une nouvelle ligne est lue, elle est stockée dans la mémoire tampon. Un octet nul final ('\ 0') est stocké après le dernier caractère Dans la mémoire tampon.

Donc, vous devez utiliser comme ça.

  fgets(input,255,infile);
  fgets(input2,255,infile2);

En vérifiant l'état,

while(input != NULL || input2 != NULL);
1
Karthikeyan.R.S