簡體   English   中英

為什么我不能使用 fscanf() 從文件中讀取連續字符?

[英]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 再次閱讀它的文檔。 很可能fgetcfscanf快得多(因為更底層)。 fscanf大多數實現都使用fgetc (或其等價物)。

最后,一些C 標准庫實現免費軟件 在 Linux 上,GNU glibcmusl-libc都是。 你可以研究他們的源代碼。 這樣做你會學到很多東西。 兩者都構建在 Linux syscalls(2)之上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM