上記は、ファイルからテーブルを読み取るための私のCコードです。その..最後の値は2回印刷されています!!!
ファイル読み取りループの構造上、最後の値は 2 回出力されます。このeof()
フラグは、ファイルの末尾を超えて読み取ろうとするまで設定されません。ファイルの最後の行からfscanf()
最後の 2 つの s を読み取るときはまだ設定されていませんが、次の呼び出しは失敗して設定されますが、結果はすぐに照会されず、以前に抽出されたs が使用されます: すべての読み取り操作の結果を確認しますすぐに。long
eof()
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
は最初の値の現在の値 (最後に正常に読み取られた最初の値、または最後に正常に読み取られた最初の値から計算された値) を格納する です。