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;
}
然而,问题是目前我正在尝试将 afopen
与 a进行比较char
:
if (*fp == x || *fp == y) {
printf("no A's are allowed!\n");
return 1;
}
由于明显的原因,这不起作用。
我的问题是我如何将 afopen
转换为 a char
,以便文件指针返回char
我可以评估的 a - 或者我该如何解决这个问题?
解决方案
“文件指针”之类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
您所期望的。这很重要。)
其他改进:
我摆脱了对
feof
. 请参阅“为什么while ( !feof (file) )
总是错的? ”我将其替换为while((c = getc(fp)) != EOF)
,这在开始时确实相当晦涩,但它是一个经典的 C 习语,您需要尽快学习。(我理解你认为feof
代码做了什么,以及为什么你认为它有效,但相信我,这不好。)除了文件不存在之外,文件可能无法打开。我添加了一个调用来
strerror
解释为什么文件打开可能失败。我摆脱了你并不真正需要的
x
and变量。y
我重命名
ReadFile
为main
使其成为独立程序。
推荐阅读
- sql - 使用 Group by 的 SQL 命令出错?
- azure - 监视 Azure SQL 数据库
- html - Select specific divs with an nth selector?
- python - Play sound when objects collide
- java - 尝试使用 Hadoop FileSystem 连接到 S3 存储桶,但会出现错误提示该存储桶在此区域中
- swift - 对象位置不匹配(Spritekit)
- c# - NHibernate - deleting row is postponed to Commit(), but adding row not.
- c# - ContentDialog should not be in focus
- java - JAVA PDF比较来自不同国家的PDF文档
- django-models - How to get the specific field of foreignkey using values function in Django?