[英]fseek on a position beyond EOF does not trigger EOF using feof, how come?
我正在從一個文件讀取數據到打開的內存:
FILE *f = fopen(path, "rb");
在我開始從文件中復制字節之前,我使用以下方法尋找起始位置:
/**
* Goes to the given position of the given file.
*
* - Returns 0 on success
* - Returns -1 on EOF
* - Returns -2 if an error occured, see errno for error code
* - Returns -3 if none of the above applies. This should never happen!
*/
static int8_t goto_pos(FILE *f, uint64_t pos)
{
int err = fseek(f, pos, SEEK_SET);
if (err != 0) {
if (feof(f) != 0) return -1;
if (ferror(f) != 0) return -2;
return -3;
}
return 0;
}
問題在於,即使我尋求超出EOF
的位置,此函數也不會返回-1。
根據參考,當遇到EOF
時, feof
應返回非零值。
為什么是這樣? feof
功能無用嗎?
請注意,我目前正在使用fgetc
的返回值來檢查EOF
。
尋求根本不測試文件的結束。
這樣做的原因是你可能想要在你想要的地方做一個fwrite()
。 fseek()
在調用之后無法知道你的計划是什么。
在文件結束后搜索后執行fread()
,你將得到feof()
返回非零值。
feof()
在嘗試讀取失敗后設置,所以fgets()
或fread()
之前。
在EOF之后尋求將在后續寫入之后放大文件,因此這符合其他人的信念。 見這里: fseek
fseek()函數應允許將文件位置指示符設置為超出文件中現有數據的末尾。 如果此時稍后寫入數據,則后續讀取間隙中的數據將返回值為0的字節,直到數據實際寫入間隙。
這就是fseek無法返回EOF的原因。 如果您嘗試從以前沒有任何內容寫入該位置或后面的位置讀取,您將稍后獲得EOF。 所以這是正確的行為。
在某些操作系統上查找超出文件末尾會增加文件的大小。 只要有足夠的空間使文件變大,它就永遠不會返回錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.