web-dev-qa-db-ja.com

Cで、テキストファイルを1行ずつ印刷するにはどうすればよいですか?

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;
}

私の出力は次のようになります。

出力

Word by Wordではなく、ファイル1を1行で印刷したいと思います。 file2についても同じことが言えます。私はCに少し慣れていないので、行き詰まっています。

行全体を読みたい場合は、fgetsの代わりに 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);

printf\nを使用しなくなったことに注意してください。これは、fgetsが入力文字列内のファイルから\nを保持するためです。

5
dasblinkenlight

コードに変更を加えて機能しましたが、別の質問があります。ファイルを比較して、次のような新しいファイルに違いを書き出したい場合:

  1. File1:私の名前はKnutです
  2. File2:私の名前はKnutAndreです
  3. File3:Andre(これはファイル間の違いです)。

私の先生はstrcmpを使用して出力を新しいファイルに入れるように私に言いました、しかし私は彼を完全に理解していません..誰かが私が試すことができるいくつかのヒントを持っていますか?

これは私のコードがこれまでどのように見えるかです:

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;



}

私の学校では、get_next_line関数を作成します。この関数は、ファイル記述子とパラメーター内の文字列へのポインターを受け取ります。

ここを見ることができます: https://github.com/juschaef/libtowel/search?utf8=%E2%9C%93&q=get+next+line

2
albttx

fscanfを使用している場合、空白以外の文字が出現するまで文字を読み取るだけです。入力を行全体として取得する必要がある場合は、fgets()を使用する必要があります。

fgets()manページから。

fgets()は、ストリームから最大で1つ小さいサイズの文字を読み込み、sが指すバッファーにそれらを格納します。 EOFまたは改行の後に読み取りが停止します。改行が読み取られると、バッファーに格納されます。終了ヌルバイト( '\ 0')は、バッファーの最後の文字の後に格納されます。 。

したがって、このように使用する必要があります。

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

状態確認しながら、

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