c - 读入文本文件 - 一次 1 个字符。使用 C

标签 c arrays text-files

我正在尝试逐行读取文本文件并单独处理每个字符。

例如,我的文本文件中的一行可能如下所示: ABC XXXX XXXXXXXX ABC

行中总会有不同数量的空格。但字符数相同(包括空格)。

这就是我目前所拥有的......

char currentLine[100];
fgets(currentLine, 22, inputFile);

然后我尝试遍历 currentLine 数组并处理每个字符...

for (j = 0; j<22; j++) {
    if (&currentLine[j] == 'x') {
        // character is an x... do something
     }
}

谁能帮我解决这个问题?

您可能会说 - 我刚刚开始使用 C。

最佳答案

类似下面的内容是逐字符处理文件的规范方法:

#include <stdio.h>

int main(int argc, char **argv) 
{

    FILE *fp;
    int c;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s file.txt\n", argv[0]);
        exit(1);
    }
    if (!(fp = fopen(argv[1], "rt"))) {
        perror(argv[1]);
        exit(1);
    }
    while ((c = fgetc(fp)) != EOF) {

        // now do something with each character, c.

    }
    fclose(fp);
    return 0;
}

请注意,c 被声明为 int,而不是 char,因为 EOF 的值不同于所有可以存储在 char 中的字符。

对于更复杂的解析,一次读取一行文件通常是正确的方法。但是,您会希望对格式不正确的输入数据采取更多防御措施。本质上,编写代码时假设外部世界是敌对的。永远不要假设该文件是完整的,即使它是您刚刚编写的文件。

例如,您正在使用 100 个字符的缓冲区来读取行,但将读取的数量限制为 22 个字符(可能是因为您知道 22 是“正确的”行长度)。额外的缓冲区空间很好,但您应该考虑到文件可能包含长度错误的行的可能性。即使这是一个错误,您也必须决定如何处理该错误并重新同步您的流程或放弃它。

编辑:我已经为典型的简单案例添加了一些假设的程序其余部分的框架。对于 C 的新用户,有几点需要指出。首先,我假设有一个简单的命令行界面来获取要处理的文件的名称,并使用 argc 验证了一个参数真的存在。如果没有,我将利用 argv[0] 的内容打印一条简短的使用消息,按照惯例,它以某种有用的方式命名当前程序,并以非零状态退出。

我以文本模式打开文件进行阅读。文本模式和二进制模式之间的区别在 Unix 平台上并不重要,但在其他平台上可能很重要,尤其是 Windows。由于讨论的是一次处理一个字符的文件,我假设该文件是文本而不是二进制文件。如果 fopen() 失败,则它返回 NULL 并将全局变量 errno 设置为失败原因的描述性代码。对 perror() 的调用将 errno 转换为人类可读的内容,并将其与提供的字符串一起打印。我在这里提供了我们试图打开的文件的名称。结果将类似于“foo.txt:没有这样的文件”。在这种情况下,我们也以非零状态退出。我没有在意,但出于不同的原因以不同的非零状态代码退出通常是明智的,这可以帮助 shell 脚本更好地感知错误。

最后,我关闭了文件。原则上,我还应该测试 fclose() 是否失败。对于只读取文件的进程,大多数错误条件已经被检测为某种内容错误,并且不会在结束时添加任何有用的状态。但是,对于文件写入,在调用 fclose() 之前,您可能不会发现某些 I/O 错误。写入文件时,最好检查返回码并期望在接触文件的任何调用中处理 I/O 错误。

关于c - 读入文本文件 - 一次 1 个字符。使用 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179671/

相关文章:

javascript - 如何在每个对象的末尾插入带有变量和值的新对象

c - 使用 VS Studio 调试非常大的文件

c - 代表 serv_addr 缓冲区的字符串是什么格式?

c++ - 在数组中获取和存储内存地址的问题

javascript - 多维数组 Javascript

python - 在大写字母前插入空格的pythonic方法

c++ - 在 C 中使用 C++ 类

C指针问题

javascript - AJAX/Javascript - 将 txt 文件的内容传递给 Javascript 变量

java - 从 URL 检索 txt 文件的内容到 Android