[英]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.