C - 如何迭代文本文件并检查特定字符是否存在

标签 c

我目前正在编写一个 C 程序,它非常简单地将一个文件作为输入,然后迭代该文件并检查文件中是否存在字符“a”或“A”。如果没有找到 a,则终止,否则打印一条消息。这里的 a 只是为了展示,我尝试制作一个简单的程序,可以搜索任何 char 参数(后来扩展到整数等)

程序如下:

int ReadFile(char* argv[]) {
FILE *fp; 
char x = 'a';
char y = 'A';
fp = fopen(argv[1], "r");

if (!fp) { // checks if the file exists
    printf("File does not exist!\n");
    return 1;
}

while (!feof(fp)) { // keeps reading until file end of file (feof)
    if (*fp == x || *fp == y) {
        printf("no A's are allowed!\n");
        return 1;
    }
}
fclose(fp); // always close file after use
printf("Ok\n");
return 0;
} 

但问题是目前我正在尝试将 fopenchar 进行比较,其中:

if (*fp == x || *fp == y) {
        printf("no A's are allowed!\n");
        return 1;
    }

由于显而易见的原因,它不起作用。

我的问题是如何将 fopen 转换为 char,以便文件指针返回一个我可以评估的 char - 或者我怎样才能解决这个问题?

最佳答案

fp这样的“文件指针”不是指向文件内容的指针。它是一个“句柄”或“描述符”,允许您在已打开的文件上读取字符(并执行其他操作)。

您需要使用像getc这样的函数来读取字符:

c = getc(fp);

所以你的程序的改进版本可能看起来像

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    FILE *fp; 
    int c;

    fp = fopen(argv[1], "r");

    if (!fp) {
        printf("Can't open file %s: %s\n", argv[1], strerror(errno));
        return 1;
    }

    while ((c = getc(fp)) != EOF) {
        if (c == 'a' || c == 'A') {
            printf("no A's are allowed!\n");
            return 1;
        }
    }

    fclose(fp); // allways close file after use

    printf("Ok\n");

    return 0;
} 

最大的区别是我没有调用 getcfp 读取字符并将它们存储在变量 c 中。 (另请注意,c 被声明为 int,而不是您可能期望的 char。这一点很重要。)

其他改进:

  1. 我摆脱了对 feof 的调用。请参阅“Why is while ( !feof (file) ) always wrong? ”,我将其替换为 while((c = getc(fp)) != EOF),这确实一开始相当晦涩,但这是一个经典的 C 习惯用法,您可以使用它需要尽快学习。 (我理解您认为 feof 代码做了什么,以及为什么您认为它有效,但相信我,这不好。)

  2. 文件可能因不存在以外的原因而无法打开。我添加了对 strerror 的调用来解释文件打开可能失败的原因。

  3. 我删除了您并不真正需要的 xy 变量。

  4. 我将 ReadFile 重命名为 main,使其成为一个独立的程序。

关于C - 如何迭代文本文件并检查特定字符是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57759472/

相关文章:

c - 是否有任何库来解析 C 中的 TCP/IP/UDP header

c - 将字符串数组从函数传递到主函数(C 代码)

c - 传递给 sg_init_table() 函数的散点列表指针是否需要在之前分配?

c - 使用外部指针声明外部函数时出错

c - “b++”的汇编

c - 为什么我无法重定向 gcc -H 的输出

c - 解决指针转换警告

c - 如何在 C 中演示 fork() 不可预测的顺序?

c - C 中无符号字符数组相减的最有效方法

c - Swift 使用 c 结构