[英]Why does fread always return 0?
我用這段代碼來讀取文件。 但是 fread function 總是返回 0。我的錯誤是什么?
FILE *file = fopen(pathToSourceFile, "rb");
if(file!=NULL)
{
char aByte[50000];
int ret = fread(aByte, sizeof(aByte), 1, file);
if(ret != 0)
{
not jump into there;
fseek(file, 0, SEEK_SET);
fwrite(aByte, ret, 1, file);
}
}
fclose(file);
您確定您的文件大小大於 50000 嗎? 否則你可以嘗試:
fread(aByte,1, sizeof(aByte), file);
你不能fwrite
到一個文件打開rb
模式。
您關於ret
始終為零的說法是錯誤的。 如果您正確檢測了您的代碼,您就不會做出虛假聲明:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("junk.dat", "rb");
if(file!=NULL)
{
char aByte[50000];
int ret = fread(aByte, sizeof(aByte), 1, file);
fprintf(stderr, "fread returned %d\n", ret);
if(ret != 0)
{
int fs = fseek(file, 0, SEEK_SET);
if(fs == -1) {
perror("fseek");
exit(1);
}
fs = fwrite(aByte, ret, 1, file);
if(fs != ret) {
perror("fwrite");
exit(1);
}
}
}
fclose(file);
return 0;
}
產量:
fread returned 1
fwrite: Bad file descriptor
運行時。
以防其他人遇到這種情況。 我剛剛遇到了類似的問題。 這是因為 fread 的第二個參數應該是緩沖區中每個元素的大小。 在 OP 的代碼中,它是指向緩沖區的指針的大小。
如果 buff 至少有 1 個元素,這應該可以工作:
int ret = fread(aByte, sizeof(aByte[0]), 1, file);
就我而言,我想讀取一個大小為 6553600 字節(一個 mp3)的文件,它返回讀取的 0 個字節。 它讓我發瘋,直到我嘗試手動硬編碼 30 個字節,它確實讀取了 30 個字節。
我開始玩它,看看它可以讀取多少,結果它可以准確讀取 262144 (2^18) 個字節,如果你要求它讀取 262145 個字節,它讀取的是 0。
結論:至少使用此功能您無法一次性加載整個文件。
請檢查 man fread
size_t fread(void *restrict ptr, size_t size, size_t nmemb, FILE *restrict stream);
返回值
成功時,fread() 和 fwrite() 返回讀取或寫入的項目數。 只有當 size 為 1 時,此數字才等於傳輸的字節數。 如果發生錯誤,或已到達文件末尾,則返回值為短項計數(或零)。
因為你的文件小於 50000Bytes aka。 項的大小,讀取的項數為 0。
就我而言,
fseek(rFile, 0, SEEK_END);
iTotalSize = ftell(rFile);
fseek(rFile, 0, SEEK_SET); // <-- I wrote SEEK_END, not SEEK_SET
所以它讀取 0 字節(任何東西)
你是否:
#include <unistd.h>
否則,如果您在沒有 -Wall 的情況下進行編譯,C 編譯器可能會錯誤地假定 fread() 的第二個參數是 int 而不是 off_t,這可能會弄亂函數調用。 您的代碼片段未顯示任何 #include 語句,因此請確保包含您正在使用的所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.