【发布时间】:2017-03-15 13:32:31
【问题描述】:
今天我在学习 C 中的 File 并提出一个问题
首先我创建了一个如下的文本文件:
5 1 5 2 4 -3
第一个元素是数组大小,我使用以下代码编写了一个将所有正值读入整数数组的函数:
void readFileToArray(char *fname, int *a, int *pn) {
int number;
int quantity;
FILE *fp = fopen(fname, "r");
fscanf(fp, "%d", &quantity);
while (*pn < quantity) {
fscanf(fp, "%d", &number);
if (number >= 0) {
a[*pn] = number;
(*pn)++;
}
else
quantity--;
}
fclose(fp);
}
它成功将 1 5 2 4 读入数组
接下来我把文本文件改成了这个
5 1a 5 2 4 -3
感谢 Tutorialspoint,我想出了如何消除 1a 并使用此代码将 5、2、4 读入数组
void readFileToArray(char *fname, int *a, int *pn) {
int number, test;
char space;
int quantity;
FILE *fp = fopen(fname, "r");
fscanf(fp, "%d", &quantity);
while (*pn < quantity) {
fpurge(stdin);
test = fscanf(fp, "%d%c", &number, &space);
if (test != 2 || space != ' ')
quantity--;
else {
a[*pn] = number;
(*pn)++;
}
}
fclose(fp);
}
但是对于文本文件
5 1a a5 2 4 -3
前面的代码块无法将文件读入数组。当我尝试调试时,我注意到下面的代码行
test = fscanf(fp, "%d%c", &number, &space);
它读取a5并返回值0,这是正确的。此时:
number = 1
space = a //because it cannot read a5 into the format %d%c
但是,在下一次循环运行时,数字和空格仍然保持值 1 和直到循环结束。程序退出,没有值读入数组
谁能解释原因并建议我一个解决方案?
P/s:对不起我的英语不好。
【问题讨论】:
-
建议您阅读如何根据空格标记字符串
' 'character。然后分析单个令牌以检查它们是否为整数,如果它们是整数,则将令牌转换为整数,然后将它们插入数组中。 -
对于初学者,您应该始终检查
fscanf()返回的值。如果您甚至不知道它是否有效,就很难验证来自该调用的数据。 -
使用
fscanf将限制您的程序以一种指定的方式工作。相反,我会推荐使用fgetc,它会逐字符读取文件,然后您可以使用ASCII值来确定是否需要该字符。 -
用
fgets()读取行,然后解析。