簡體   English   中英

為什么 fread 總是返回 0?

[英]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);

ferror()會告訴什么時候有問題。

您可以使用perror()打印實際的錯誤消息。

你不能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

男人害怕(3)

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.

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