0
#include <stdio.h>
int main(void)
{
   clrscr();
   FILE *fin;

   fin=fopen("data.txt","r");

   if(fin==NULL)
   {
    printf("can not open input fil");
    return 0;
   }

   long data[2];

   while(!feof(fin))
   {
       fscanf(fin,"%ld %ld",&data[0],&data[1]);
       printf("\n%ld %ld",data[0],data[1]);
   }
   fclose(fin);
   return;
   }

上記は、ファイルからテーブルを読み取るための私のCコードです。その..最後の値は2回印刷されています!!!

data.txt
1   34
2   24
3   45
4   56
5   67

しかし、以下のような壊れたテーブルで適切な値を取得できません...どうすれば解決できますか? (ここでは、「ヌルスペース」またはゼロを返す必要がある値が見つからない場合に機能するはずですが、次の値ではありません..)

data.txt
1   34
2   
3   45
4   
5   67

同様にdata.txt

1 34
  57
3 45
4   
5 34
4

2 に答える 2

2

上記は、ファイルからテーブルを読み取るための私のCコードです。その..最後の値は2回印刷されています!!!

ファイル読み取りループの構造上、最後の値は 2 回出力されます。このeof()フラグは、ファイルの末尾を超えて読み取ろうとするまで設定されません。ファイルの最後の行からfscanf()最後の 2 つの s を読み取るときはまだ設定されていませんが、次の呼び出しは失敗して設定されますが、結果はすぐに照会されず、以前に抽出されたs が使用されます: すべての読み取り操作の結果を確認しますすぐに。longeof()fscanf()eof()fscanf()long


考えられる解決策は、 を使用して一度に 1 行ずつ読み取り、 をfgets()使用して読み取った行から値sscanf()を抽出することです。longを使用するfscanf()と、2 番目に要求された を見つけるために改行文字を読み飛ばしてしまいますがlong、これは望ましい動作ではありません。

例えば:

char line[1024];
while (fgets(line, 1024, fin))
{
    /* Assign appropriate default values.
       sscanf() does not modify its arguments
       for which it has no value to assign.
       So if 'line' has a single long value
       data[1] will be zero. */
    long data[2] = { 0, 0 };

    /* You can use 'result' if you require to take particular
       action if it reads only 1, or 0, items. */
    int result = sscanf(line, "%ld %ld", &data[0], &data[1]);

    printf("\n%ld %ld",data[0],data[1]);
}

質問の更新に応じて)2番目の値が欠落している行を区別するには:

2

最初の値が欠落している行:

57

行に欠落していた値 (最初または 2 番目) を特定するには、有効な範囲 (またはその他の基準) が必要です。

int result = sscanf(line, "%ld %ld", &data[0], &data[1]);
if (1 == result)
{
    if (data[0] >= 1 && data[0] <= 9)
    {
        printf("\n%ld 0", data[0]);
    }
    else
    {
        /* Read value was the second value. */
        printf("\n%ld %ld", ++last_first_value, data[0]);
    }
}

ここlast_first_valueで、longは最初の値の現在の値 (最後に正常に読み取られた最初の値、または最後に正常に読み取られた最初の値から計算された値) を格納する です。

于 2012-10-29T11:26:25.383 に答える
0
while(!feof(fin))
{
   fscanf(fin,"%ld %ld",&data[0],&data[1]);
   printf("\n%ld %ld",data[0],data[1]);
}

feoftrueファイルの最後を超えて読み込もうとするまで返されないため、ループが頻繁に実行されます。の戻り値を確認し、fscanf期待した値 (この場合は 2) と一致しない場合は、EOFを確認することをお勧めします。考えられる再構築の 1 つを次に示します。

int good = 1;
while (good)
{
  int itemsRead = fscanf(fin, "%ld %ld", &data[0], &data[1]);
  if (itemsRead == 2)
  {
    // process data[0] and data[1] normally
  }
  else 
  {
    good = !good;
    if (feof(fin))
      printf("Hit end of file\n");
    else if (ferror(fin))
      printf("Error during read\n");
    else
      printf("Malformed input line\n");
  }
}
于 2012-10-29T15:58:55.110 に答える