C++;:无法读取.BMP文件;早于预期到达文件结尾 我目前正在尝试使用C++读取BMP文件,但不知何故,在读取了几个字节之后,文件的结尾就达到了( FGET CVE)( >返回 -1 < /COD>)。我已将问题简化为一个最小的示例: #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; } #包括 int main() { //打开文件 FILE*FILE=fopen(“C:/Path/to/FILE”,“r”); //获取并打印文件大小(字节) fseek(文件,0L,SEEK\u结束); 标准::cout

C++;:无法读取.BMP文件;早于预期到达文件结尾 我目前正在尝试使用C++读取BMP文件,但不知何故,在读取了几个字节之后,文件的结尾就达到了( FGET CVE)( >返回 -1 < /COD>)。我已将问题简化为一个最小的示例: #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; } #包括 int main() { //打开文件 FILE*FILE=fopen(“C:/Path/to/FILE”,“r”); //获取并打印文件大小(字节) fseek(文件,0L,SEEK\u结束); 标准::cout,c++,bmp,fgetc,C++,Bmp,Fgetc,变化 FILE* file = fopen("C:/Path/to/file", "r"); 到 以二进制模式读取文件。这通常有助于避免此类奇怪的错误。更改 FILE* file = fopen("C:/Path/to/file", "r"); 到 以二进制模式读取文件。这通常有助于避免此类奇怪的错误。在DOS/Windows上以纯“r”模式读取文件可能会将ASCII 26(^Z)视为“文件结尾”。它还可能将行结尾从CR LF(13 10)转换为LF(10),这也是您不希望的 查看您的示例文

变化

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

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

更改

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

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

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

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

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

使用“rb”:

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

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

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

使用“rb”:


既然你使用C++,使用C++代码> FOpen/<代码>类型的方法非常奇怪。流可以做你在这里做的所有事情。因为你使用C++,可能会重复使用C代码> fOpen< /COD>类型方法。这是非常奇怪的。流可以做你在这里做的一切。它可能是这些简单、微妙的错误的复制品。我会尽快接受答案。总是这些简单、微妙的错误会让你发疯,谢谢你的帮助。我会尽快接受答案。
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
FILE* file = fopen("C:/Path/to/file", "rb");