【问题标题】:How to read file and validate input?如何读取文件并验证输入?
【发布时间】: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()读取,然后解析。

标签: c arrays file


【解决方案1】:

在您的代码中,fscanf() 函数调用正在寻找输入流中的模式(即:文件中的文本),该模式应以十进制整数开头。由于“a5”不是以整数或符号 ('-') 开头,因此会发生匹配失败。当匹配失败时,字符“a”被推回流中,fscanf 函数返回。在连续的循环中,同样的事情会发生,因为输入流来自一个文件,并且不会改变。

在以下堆栈溢出线程中讨论了一个非常相似的问题: Behavior of fscanf when format doesn't match file contents

既然您提到您正在学习 C,我建议您查看“The C Programming Language by K&R”一书中的各种代码示例。我记得有些例子使用 getchar() 来解析来自标准输入的输入。您可以使用相同的方法,但使用 fgetc(如 Sma 前面提到的)。我相信你会喜欢读这本书(同时学习语言!!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2018-08-07
    • 2020-11-05
    • 2011-02-25
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多