c - 为什么 fread() 在一串 0 处停止?

标签 c file io fread

我正在尝试读取具有以下二进制配置的二进制文件

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 找到了正确的文件大小。

至于为什么需要那个字符串0,是因为00 00 00 1A构成了一个32位的整数,刚好小到可以留下三个0x00 .

我怀疑文件开头的一串0x00被识别为EOF,所以我尝试在文件前面填充一个字符,但是它不太成功。

这可能是什么原因造成的?

最佳答案

在 Windows 中,0x1A a.k.a ^Z 是文件结束字符。您以文本模式而不是二进制模式打开了文件。当您在 Windows 中以文本模式打开文件时,它将一直读取到文件末尾或第一个 ^Z 字符。

"rb" 传递给 fopen 而不是 "r" 以二进制模式打开文件。

关于c - 为什么 fread() 在一串 0 处停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631948/

相关文章:

c - 在 firstapp1.exe : 0xC0000005: Access violation writing location 0x00000000 中的 0x6D4DE559 (ucrtbased.dll) 抛出异常

c# - 在 C# 中使文件可写的最佳方法

java - 在Java中查找特定文件夹

bash - 如何在没有所需库的情况下将由于运行可执行文件而导致的系统错误重定向到文件?

c - 接收 SIGSEGV 的程序可能是针对 0xffffffff 的指针

c - 使用 C 中的函数和指针将 n 个数组合并为一个

c - 我们在用户输入过程中使用 & 符号,但为什么我们在 C 中的赋值过程中不需要它?

c - 逐行读取直到找到整数 C

java - 将包含 "ñ"等字符的字符串写入 txt 文件

java - 发现 File.mkdirs() 失败的原因