C++:读取.BMP文件时出现问题;文件结束时间早于预期



我目前正在尝试使用 C++ 读取.BMP文件,但不知何故,在读取几个字节后到达文件末尾(fgetc()返回 -1 (。我将问题简化为一个最小示例:

#include <iostream>
int main()
{
    // Open file
    FILE* file = fopen("C:/Path/to/file", "r");
    // Get and print file size in bytes
    fseek(file, 0L, SEEK_END);
    std::cout << ftell(file) << std::endl;
    rewind(file);
    int byte, i = 0;
    do
    {
        // Get each byte
        byte = fgetc(file);
        // Print i and value of byte
        std::cout << i << ", " << byte << std::endl;
        i++;
    }
    // Stop reading when end of file is reached
    while (byte != EOF);
    std::cin.get();
    return 0;
}

当使用它读取.BMP文件时(在.txt文件等简单格式上不会出现问题(,它会正确读取文件长度,但在到达文件末尾之前找到EOF方式。

例如,使用此文件,它读取的文件长度为 120054,但fgetc()在 i=253 时返回-1

到底做错了什么,我该如何解决这个问题?

在DOS/Windows上以纯"r"模式读取文件可能会将ASCII 26(^Z(视为"文件结束"。它还可以将行尾从 CR LF (13 10( 转换为 LF (10(,这也是您不想要的。

查看您的示例文件,我确实看到了该字符(它是十六进制1A(:

0000340 0c 1f 15 0e 1f 15 0e 1f 14 10 1f 14 10 21 17 10
0000360 21 17 10 22 18 11 23 19 12 25 19 13 26[1a]14 26

位置是 375 八进制,即 253 十进制。听起来很耳熟?:)

使用"rb":

FILE* file = fopen("C:/Path/to/file", "rb");

更改

FILE* file = fopen("C:/Path/to/file", "r");

FILE* file = fopen("C:/Path/to/file", "rb");

以二进制模式读取文件。这通常有助于避免这种奇怪的错误。

最新更新