所以我把这个名为“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小时了解这个问题
答案 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
必须随您使用的每个插槽而改变。我将把它作为练习来实现这一点。