簡體   English   中英

fgetc返回一個未知字符

[英]fgetc returns an unknown character

我有以下代碼:

FILE *f = fopen('/path/to/some/file', 'rb');
char c;
while((c = fgetc(f)) != EOF)
{
    printf("next char: '%c', '%d'", c, c);
}

由於某些原因,在打印字符時,在文件末尾,將打印出不可渲染的字符以及ASCII序數-1。

next char: '?', '-1'

這應該是什么角色? 我知道這不是EOF,因為要進行檢查,並且在打印字符后很快就會執行SEGFAULT程序。

麻煩的是fgetc()及其親戚返回一個int ,而不是char

如果未設置由流指向的輸入流的文件結尾指示符,並且存在下一個字符,則fgetc函數將獲取該字符作為unsigned char並將其轉換為int並將該流的關聯文件位置指示符前進(如果已定義)。

如果設置了流的文件結束指示符,或者流在文件末尾,則設置了流的文件結束指示符,並且fgetc函數返回EOF

它必須返回每個可能的有效字符值和一個不同的值EOF (為負值,通常但不一定是-1 )。

當您將值讀入char而不是int ,發生以下兩種不良情況之一:

  • 如果純char是無符號的,則您永遠不會獲得等於EOF的值,因此循環永遠不會終止。

  • 如果對普通char進行了簽名,則可能會誤認為一個合法字符,即0xFF(通常是,y-umlaut,U + 00FF,帶有DIAERESIS的拉丁文小寫字母Y)與EOF相同,因此您會過早檢測到EOF。

無論哪種方式,它都不是很好。

修復

解決方法是使用int c; 代替char c;


順便說一句, fopen()調用不應編譯:

FILE *f = fopen('/path/to/some/file', 'rb');

應該:

FILE *f = fopen("/path/to/some/file", "rb");

始終檢查fopen()的結果; 在所有I / O功能中,它幾乎比其他任何功能都更容易出錯(不是因為它本身的錯誤,而是因為用戶或程序員對文件名犯了錯誤)。

這是罪魁禍首:

char c;

請更改為:

int c;

fgetc的返回類型是int ,而不是char 在某些平台上將int轉換為char時,會得到奇怪的行為。

暫無
暫無

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

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