今天我正在学习C中的文件并提出问题
首先我创建了一个文本文件,如下所示:
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:抱歉我的英语不好。
答案 0 :(得分:1)
在您的代码中,fscanf()函数调用正在输入流中查找模式(即:文件中的文本),该模式应以十进制整数开头。因为&#34; a5&#34;不以整数或符号开头(&#39; - &#39;),发生匹配失败。当匹配失败发生时,角色&#34; a&#34;被推回到流上,fscanf函数返回。在连续循环期间,同样的事情发生,因为输入流来自文件,并且不会改变。
以下堆栈溢出线程中讨论了一个非常类似的问题: Behavior of fscanf when format doesn't match file contents
由于您提到您正在学习C,我建议您查看K&amp; R&#34;&#34; C编程语言中的各种代码示例。书。我记得有些例子使用getchar()来解析stdin的输入。您可以使用相同的方法,但使用fgetc(如前面Sma所述)。我相信你会喜欢阅读这本书(同时学习这门语言!!)