读取文件,然后将数字存储在数组C中

时间:2014-03-07 03:14:22

标签: c arrays file

所以我把这个名为“score.txt”的文件带有内容

NAME
20
NAME2
2

我正在使用这段代码,但它出错了,我不知道如何将文件中的整数放入数组中。

int main(){

FILE* file = fopen ("score.txt", "r");
 int i = 0;

  fscanf (file, "%d", &i);    
  while (!feof (file))
{  
  printf ("%d ", i);
  fscanf (file, "%d", &i);      
}
  fclose (file);
 system("pause");
 }  

我只是自学,而且我已经尝试过2小时了解这个问题

1 个答案:

答案 0 :(得分:2)

使用fscanf输入时某些行会使格式失败的问题是,while循环的每次迭代都不会提升文件,所以你会卡住。

您可以使用fgets获取数据并sscanf获取数据来获取解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void) {
    int i = 0;
    int ret = 0;
    char buf[50];

    FILE *file = fopen("score.txt", "r");
    if (file == NULL) {
         fprintf(stderr,"Unable to open file\n");
         exit(1);
    }

    while (fgets(buf,sizeof(buf),file)) {
         ret = sscanf(buf,"%d",&i);
         if (ret == 1) { // we expect only one match
               printf("%d\n", i);
         } else if (errno != 0) {
               perror("sscanf:");
               break;
         }
     }
     fclose(file)
     return(0);
}

这将输出,输入:

20
2    

我们检查sscanf的输出,因为它告诉我们格式是否已正确匹配,这只会发生在整数行,而不是“NAME”行。我们还检查'errno',如果sscanf遇到错误,将设置为非零。

我们使用char buf[50];来声明一个包含50个插槽的char数组,fgets然后用它来存储读取的行;但是如果该行的长度超过50个字符,那么它将被fgets以50个字符块的形式读取,您可能无法获得所需的结果。

如果您希望将读取的整数存储到数组中,则必须声明一个数组,然后在每次读取时将该数组中的一个插槽分配给您读取的int的值,即int_array[j] = i(其中j必须随您使用的每个插槽而改变。我将把它作为练习来实现这一点。