OPはかなり近いです。スキャンに失敗したら停止します。
fscanf()
スキャンされたフィールドの数または を返しますEOF
。この場合、チェックする1
だけで十分です。
// for (repetition = 0; itemPrice <= 1000; repetition++) Use <, not <= @Arpit
for (i = 0; i < 1000; )
{
int retval = fscanf(userFile, "%f", &itemPrice[i]);
if (retval != 1) break;
i++;
}
堅牢なソリューションは、予期しないデータを検出します。このソリューションは、ファイルの終わりまたは非浮動テキストが検出されるまで単純に続きます。
[編集] OP にはfloat
s が 1 行しかないようです。その場合、コードは行全体を読み取ってからバッファを解析できます。
#define CHAR_PER_FLOAT_MAX 20
char buf[1000*(CHAR_PER_FLOAT_MAX + 1)]; // Some large buffer
if (fgets(buf, sizeof buf, input)== NULL) return; // EOF or IO error
char *p = buf;
for (i = 0; i < 1000; ) {
int n = 0;
if (sscanf(p, "%f %n", &itemPrice[i], &n) != 1) break;
p += n;
i++;
}
if (*p) Handle_ExtraTextOnLine();
foo(itemPrice, i); // Use data
もう 1 つの方法は、ファイルから一度に 1 つずつ直接読み取りfloat
、次の行末の空白を調べることです。エレガントではありません。
for (i = 0; i < 1000; ) {
if (fscanf(input, "%f", &itemPrice[i]) != 1) {
// need to add code to consume the rest of the line if processing is to continue.
break;
}
i++;
// look for standard white-space
char buf[2];
while (fscanf(input, "%1[ \f\n\r\t\v]", buf) == 1) {
if (buf[0] == '\n') break;
}
}
foo(itemPrice, i); // Use data