在 Windows 上的文件结束之前到达 EOF

Reaching EOF before end of file on windows

提问人:Mangal K 提问时间:2/8/2021 更新时间:2/8/2021 访问量:339

问:

#include <stdio.h>
#include <stdlib.h>

const int size = 512;
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: ./recover image\n");
        return 1;
    }

    FILE *file = fopen(argv[1], "r");
    if (file == NULL)
    {
        fprintf(stderr, "Could not open file\n");
        return 1;
    }
    unsigned char buffer[size];
    int count = 0;
    FILE *jpeg = NULL;

    while(fread(buffer, size, 1, file))
    {
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
        {
            char image[7];
            if (count != 0)
            {
                fclose(jpeg);
            }
            sprintf(image, "%03i.jpg", count);
            jpeg = fopen(image, "w");
            if (jpeg == NULL)
            {
                fprintf(stderr, "couldn't open file\n");
                return 1;
            }
            count++;
        }
        if (count != 0)
        {
            fwrite(&buffer, size, 1, jpeg);
        }
    }
    fclose(file);

}

此代码在 card.raw 中查找 jpeg 当我在 linux 上运行上述代码时,它运行正常。但在 Windows 上,代码仅读取 512 字节的 Card.raw 文件的前三个块。 我做错了什么? 我也在 Linux 上使用 clang。在 Windows 上,我正在使用 GCC。

C 文件-IO JPEG EOF FAT32

评论

2赞 klutt 2/8/2021
fopen(argv[1], "r") -> fopen(argv[1], "rb")
0赞 Mangal K 2/8/2021
我已经尝试过这个,但仍然有同样的问题。
0赞 klutt 2/8/2021
不确定这是否重要,但不应该?fread(buffer, size, 1, file)fread(buffer, 1, size, file)
0赞 Mangal K 2/8/2021
还是同样的问题
1赞 MikeCAT 2/8/2021
char image[7]; sprintf(image, "%03i.jpg", count);哎呀,超出范围访问!

答:

0赞 MikeCAT 2/8/2021 #1

首先,二进制文件应该以二进制模式打开。这意味着您应该使用 和 for 模式,而不是 和 。否则,换行符可能会被不必要的转换,并且它们可能会停在 byte 处。"rb""wb"fopen()"r""w"0x1a

其次,为数组做是不好的。的结果将是(至少)7个字符,因此需要具有8个或更多元素的数组来存储字符串,包括终止null字符。为了安全起见,您应该使用 snprintf(),它接受缓冲区大小。sprintf(image, "%03i.jpg", count);char image[7];sprintf()

评论

0赞 Mangal K 2/8/2021
我是新来的,所以我从 2 天开始就为此苦苦挣扎。