簡體   English   中英

為什么fread()停在一個0的字符串?

[英]Why is fread() stopping at a string of 0s?

我正在嘗試使用以下二進制配置讀取二進制文件

00 00 00 1A 79 20 83 DB 44 ...

使用以下功能

static BitArray getBitArray(string filename)
{
    FILE *fs = fopen(filename.data(),"r");
    fseek (fs , 0 , SEEK_END);
    unsigned long s = ftell (fs);
    rewind (fs);

    unsigned char *buffer = new unsigned char[s+1];

    fread(buffer,1,s,fs);

    BitArray bArray;
    for(int i=0; i<s; i++)
        bArray.add(buffer[i]);

    delete[] buffer;
    fclose(fs);
    return bArray;
}

其中BitArray只是我自己的操作類。 問題是,對於我上面提到的bin文件,它只讀取前三個0,就像這樣

00 00 00

即使fseek找到了正確的文件大小。

至於為什么我需要字符串0s,是因為00 00 00 1A形成一個32位整數,它恰好小到足以留下三個0x00秒。

我懷疑在文件開頭的一串0x00被識別為EOF ,所以我嘗試在文件前填充一個字符,但它沒有完全解決。

可能是什么導致了這個?

在Windows中,0x1A又名^Z是文件結束符。 您已在文本模式而不是二進制模式下打開文件。 當您在Windows中以文本模式打開文件時,它將一直讀到文件結尾或第一個^Z字符。

"rb"傳遞給fopen而不是"r"以二進制模式打開文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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