[英]Difference between fread(&c, 1, 1, input) and fgetc(input) for reading one byte
我目前正在嘗試一次讀取一個PNG文件,並且在使用fread((void*), size_t, size_t, FILE*)
和fgetc(FILE*)
時得到不同的結果。
我本質上是想“一次讀取一個字節,直到文件結束”,並且我有兩種不同的方式。 在這兩種情況下,我都可以通過以下方式以二進制模式打開所需的圖像:
FILE* input = fopen( /* Name of File */, 'rb');
並將每個字節存儲在一個字符char c
fread: while( fread(&c, 1, 1, input) != 0) //read until there are no more bytes read
fgetc: while( (c = fgetc(input)) != EOF) //Read while EOF hasn't been reached
在fread
情況下,我讀取了我需要做的所有字節。 讀取功能在文件末尾停止,我最終打印了所有380,000字節(這很有意義,因為輸入文件是380kB文件)。
但是,在fgetc
情況下,一旦到達值ff
(即-1,即宏EOF
的值)的字節,我便停止。
我的問題是,如果兩個函數都在做相同的事情,一次讀取一個字節,即使fread遇到一個帶有EOF
值的字節,fread如何知道繼續讀取? 並以此為基礎,讀取文件時如果通過EOF
,fread如何知道何時停止?
fgetc
返回一個int
,而不是一個char
。 EOF
(以及許多實際的字符代碼)無法存儲在char
,嘗試這樣做會導致未定義的行為。 所以不要那樣做。 將返回值存儲在int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.