-1

という名前のファイルの内容を読み取り、その内容pp.txtをコマンドラインに表示しようとしています。私のコードは次のとおりです。

#include<stdio.h>
#include<stdlib.h>
int main()
{

FILE *f;
float x;


f=fopen("pp.txt", "r");

if((f = fopen("pp.txt", "r")) == NULL)
{
fprintf(stderr, "Sorry! Can't read %s\n", "TEST1.txt");
}

else
{
printf("File opened successfully!\n");
}

fscanf(f, " %f", &x);

if (fscanf(f, " %f ", &x) != 1) {
fprintf(stderr, "File read failed\n");
return EXIT_FAILURE;
}

else
{
printf("The contents of file are: %f \n", x);
}


fclose(f);

return 0;
}

コンパイルした後、私は取得してFile opened successfully!File read failedいます。私のコンテンツpp.txtは34.5です。誰が私がどこで間違ったのか教えてもらえますか?

4

5 に答える 5

5

問題は、関数の一部を 2 回実行していることです。ここ:

f=fopen("pp.txt", "r");

if((f = fopen("pp.txt", "r")) == NULL)
{
fprintf(stderr, "Sorry! Can't read %s\n", "TEST1.txt");
}

そしてここ:

fscanf(f, " %f", &x);

if (fscanf(f, " %f ", &x) != 1) {
fprintf(stderr, "File read failed\n");
return EXIT_FAILURE;
}

それらをに変更します

f=fopen("pp.txt", "r");

if(f == NULL)
{
  fprintf(stderr, "Sorry! Can't read %s\n", "TEST1.txt");
  return EXIT_FAILURE;
}

r = fscanf(f, " %f", &x);

if (r != 1) 
{
  fclose(f); // If fscanf() fails the filepointer is still valid and needs to be closed
  fprintf(stderr, "File read failed\n");
  return EXIT_FAILURE;
}

int r; を定義することを忘れないでください。

最初のfscanf()呼び出しで番号が読み取られ、ファイルポインタがそれを超えて移動するため、エラーが発生しています。2 番目の呼び出しで番号が見つからず、失敗します。

于 2013-09-03T08:48:01.733 に答える
1

ファイルを一度開く

値を 1 回読み取ります (float をスキップしたい場合を除きます)。

終了する前にファイルを閉じます。

NULL の場合はファイルを閉じないでください。-> 未定義の動作につながります

#include<stdio.h>
#include<stdlib.h>
int main()
{

     FILE *f;
     float x;


     f = fopen("pp.txt", "r");

     if(f == NULL) // remove fopen here, already did that
     {
          fprintf(stderr, "Sorry! Can't read %s\n", "TEST1.txt");
     }
     else
     {
           printf("File opened successfully!\n");

           if (fscanf(f, " %f ", &x) != 1) // you were reading 2 times
           {    
                fprintf(stderr, "File read failed\n");
                fclose(f); // close the file before exiting
                return EXIT_FAILURE; 
           }
           else
           {
                printf("The contents of file are: %f \n", x);
           }

           fclose(f);
     }

     return 0;
}
于 2013-09-03T08:56:07.223 に答える
1

f=fopen("pp.txt","r");最初のステートメントの前を削除し、対応するステートメントの前ifも削除します。fscanf(f, " %f", &x);if

于 2013-09-03T08:45:23.160 に答える
0

問題:

  1. ファイルを 2 回開いています。リソースリーク。
  2. お使いの OS では、ドットの代わりにフロートのコンマ区切りを使用している場合があります。
  3. 最初の scanf の結果を確認していません

トピック スターターへの提案: コーディングを開始する前に紙にアルゴリズム (フローチャート) を作成します。コードが何をしているのか想像できないため、単純な間違いがたくさんあります。理解せずに機能させようとするだけです。

于 2013-09-03T08:48:20.673 に答える
0

pattern" %f "にスペースがあります。ファイルにこれらのスペースがないと推測しています。

于 2013-09-03T08:54:06.867 に答える