0

我正在尝试从文件中输入浮点数并将其排列成数组。

唯一的麻烦是我不知道每次会有多少个浮点数,尽管我知道浮点数的最大数量是 1000。

我需要做的是让 fscanf 获取所有浮点数,然后在下一行停止,该行充满整数。

到目前为止,这是我对本节的内容:

for (repetition = 0; repetition <= 1000; repetition++)
{ 

    fscanf(userFile, "%f", &itemPrice[itemNumber]);
    itemNumber++;

}

但不幸的是,这继续将数组值分配给接下来的几行中的所有其他值。

我找到了另一个用户输入,auctionItems并使用它来控制数组长度while(itemNumber < auctionItems)

4

4 回答 4

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;
}
于 2014-09-16T00:30:04.297 回答
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++;

}
于 2014-09-16T00:32:35.013 回答
0
char input[MAX];
while(fgets(input, MAX, userFile) != NULL){
    sscanf(input, "%lf", &itemPrice[itemNumber++]);
}
于 2014-09-16T01:18:58.890 回答
0

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 行floats。在这种情况下,代码可以读取整行,然后解析缓冲区。

#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
于 2014-09-16T00:56:08.847 回答