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 似乎只有 1 行float
s。在这种情况下,代码可以读取整行,然后解析缓冲区。
#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
另一种方法是一次直接从文件 1float
中读取,然后查看以下空白作为行尾。不那么优雅。
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