如何读取文件和验证输入?

时间:2017-03-15 13:32:32

标签: c arrays file

今天我正在学习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:抱歉我的英语不好。

1 个答案:

答案 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所述)。我相信你会喜欢阅读这本书(同时学习这门语言!​​!)