gpt4 book ai didi

c - 为什么我不能使用 fscanf() 从文件中读取连续字符?

转载 作者:行者123 更新时间:2023-11-30 20:18:09 26 4
gpt4 key购买 nike

我正在尝试使用以下代码编写一个程序来计算文件中的行数..

#include <stdio.h>

int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("invalid no. of arguments\nUsage:lc <FILENAME>\n");
return 1;
}


FILE *in=fopen(argv[1],"r");

char c;
int count=0;
fscanf(in,"%c",&c); //take the first character

while(c!=EOF)
{
if(c=='\n')
count++;
fscanf(in,"%c",&c);
}
fclose(in);

printf("TOTAL LINES:%d\n",count);
return 0;
}

我知道这可以通过使用 fgetc() 来实现,但我很好奇为什么 fscanf() 在这里不起作用。

非常感谢所有帮助。

最佳答案

您忘记测试 fscanf 的结果计数。特别是,当处理的文件是空文件时,您的程序是完全错误的。

while(c!=EOF)

永远不会发生(在任何 fscanf(in,"%c",&c) ... 之后)。 EOF不是有效字符(因此根据定义,它不在 char 的所有可能值之外)。例如,在您的系统上,char可以是无符号 8 位,并且 EOF可能是 -1 ( EOF 记录在 §7.21.1 of the C11 standard - 是一些负数 int ,而不是一些 char )。所以类型为EOF不是char 。在我的 Linux/Debian/x86-64 上,这种情况正在发生。

仔细阅读 documentation相关于<stdio.h>

一般来说,请阅读您正在使用的每个函数的文档。并学习How to debug small programs

this can be achieved by using fgetc()

是的,在你的情况下,你最好使用 fgetc 。再次阅读其文档。很可能fgetcfscanf 快得多(因为更底层) 。 fscanf 的大多数实现正在使用 fgetc (或同等内容)。

最后,一些C standard library 实现free software 。在 Linux 上,GNU glibcmusl-libc是。你可以研究一下他们的源代码。这样做你会学到很多东西。两者都是在 Linux 之上构建的 syscalls(2) .

关于c - 为什么我不能使用 fscanf() 从文件中读取连续字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com