我正在尝试从文件中输入浮点数并将其排列成数组。
唯一的麻烦是我不确切知道每次有多少浮点数但我知道最大浮点数是1000.
我需要做的是让fscanf获取所有浮动数字,但然后停在下一行,它充满了整数。
以下是本节目前的内容:
for (repetition = 0; repetition <= 1000; repetition++)
{
fscanf(userFile, "%f", &itemPrice[itemNumber]);
itemNumber++;
}
但不幸的是,这继续为下几行中的所有其他值分配数组值。
我找到了另一个用户输入auctionItems
并使用它来使用while(itemNumber < auctionItems)
来控制数组长度
答案 0 :(得分:0)
fscanf
的返回值是成功读取的项目数。用它来决定何时停止。
#include <stdio.h>
int main(int argc,char * argv[])
{
int i;
float ff[1000];
char next_text[17];
for (i=0; i < 1000; i++) {
int n_read;
n_read = fscanf(stdin, " %f", &( ff[i] ));
if (n_read < 1) {
fscanf(stdin, "%16s", next_text);
next_text[16] = (char) 0;
printf("Next text: '%s'\n", next_text);
break;
}
}
printf("Read %d items, %f .. %f\n",i,ff[0],ff[i-1]);
return 0;
}
答案 1 :(得分:0)
也许您可以使用fgetc和fputc尝试此方法:
for (repetition = 0; itemPrice <= 1000; repetition++)
{
int c = fgetc(userFile);
if (c == '\n' || c == EOF) break;
fputc(c);
fscanf(userFile, "%f", &itemPrice[itemNumber]);
itemNumber++;
}
答案 2 :(得分:0)
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
另一种方法是一次从文件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
答案 3 :(得分:0)
char input[MAX];
while(fgets(input, MAX, userFile) != NULL){
sscanf(input, "%lf", &itemPrice[itemNumber++]);
}