使用fscanf接收数组

时间:2014-09-15 23:54:57

标签: c arrays scanf character-arrays

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

唯一的麻烦是我不确切知道每次有多少浮点数但我知道最大浮点数是1000.

我需要做的是让fscanf获取所有浮动数字,但然后停在下一行,它充满了整数。

以下是本节目前的内容:

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

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

}

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

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

4 个答案:

答案 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)

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

另一种方法是一次从文件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++]);
}