首页 > 解决方案 > 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;
} 

然而,问题是目前我正在尝试将 afopen与 a进行比较char

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

由于明显的原因,这不起作用。

我的问题是我如何将 afopen转换为 a char,以便文件指针返回char我可以评估的 a - 或者我该如何解决这个问题?

标签: c

解决方案


“文件指针”之类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;
} 

最大的区别是我没有调用getc从变量中读取字符fp并将它们存储在变量c中。(另请注意,c声明int的不是char您所期望的。这很重要。)

其他改进:

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

  2. 除了文件不存在之外,文件可能无法打开。我添加了一个调用来strerror解释为什么文件打开可能失败。

  3. 我摆脱了你并不真正需要的xand变量。y

  4. 我重命名ReadFilemain使其成为独立程序。


推荐阅读