[英]If I use fscanf to read a file, can I use it to store the number of characters it reads?
[英]Why can I not use fscanf() to read consecutive characters from a file?
我正在嘗試使用以下代碼編寫一個程序來計算文件中的行數..
#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
被記錄在 -在 C11 標准的第 7.21.1 節中- 是一些負的int
,而不是一些char
)。 所以EOF
的類型不是char
。 在我的 Linux/Debian/x86-64 上,這種情況正在發生。
更仔細地閱讀與<stdio.h>
相關的文檔
通常,請閱讀您正在使用的每個函數的文檔。 並學習如何調試小程序
這可以通過使用 fgetc() 來實現
是的,在您的情況下,您最好使用fgetc 。 再次閱讀它的文檔。 很可能fgetc
比fscanf
快得多(因為更底層)。 fscanf
大多數實現都使用fgetc
(或其等價物)。
最后,一些C 標准庫實現是免費軟件。 在 Linux 上,GNU glibc和musl-libc都是。 你可以研究他們的源代碼。 這樣做你會學到很多東西。 兩者都構建在 Linux syscalls(2)之上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.