我正在尝试逐行读取文本文件并单独处理每个字符。
例如,我的文本文件中的一行可能如下所示:
ABC XXXX XXXXXXXX ABC
行中总会有不同数量的空格。但字符数相同(包括空格)。
这就是我目前所拥有的......
char currentLine[100];
fgets(currentLine, 22, inputFile);
然后我尝试遍历 currentLine 数组并处理每个字符...
for (j = 0; j<22; j++) {
if (¤tLine[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/