提问人:Mangal K 提问时间:2/8/2021 更新时间:2/8/2021 访问量:339
在 Windows 上的文件结束之前到达 EOF
Reaching EOF before end of file on windows
问:
#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。
答:
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 天开始就为此苦苦挣扎。
上一个:字符串为空仍提供 True 值
评论
fopen(argv[1], "r")
->fopen(argv[1], "rb")
fread(buffer, size, 1, file)
fread(buffer, 1, size, file)
char image[7]; sprintf(image, "%03i.jpg", count);
哎呀,超出范围访问!