“image”是指向要从中复制数据的文件的指针,“new_image”是指向要从中复制数据的目录的指针。我在循环中执行此操作,因此每次将数据从image复制到new_image后,两个指针都需要更新。由于某些原因,下面的组合给出了不正确的结果。
fwrite(image, sizeof(BYTE), 512, new_image);
fseek(image, 512, SEEK_CUR);
整个代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
BYTE check(FILE *image, BYTE array[])
{
BYTE holder;
for (int i = 0; i < 3; i++)
{
//printf("%li and %i ", ftell(image), i);
if (fread(&holder, 1, 1, image) == 0)
{
return 0;
}
if (holder != array[i])
{
return i + 1;
}
}
fread(&holder, 1, 1, image);
if (!(holder >= 0xe0 && holder <= 0xef))
{
return 4;
}
return holder;
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: ./recover file_name.raw\n");
return 1;
}
FILE *image = fopen(argv[1], "r");
if (image == NULL)
{
printf("No such file\n");
return 2;
}
BYTE array[] = {0xff, 0xd8, 0xff};
int i = 0;
int number = 0;
BYTE m;
char name[8];
long images[51];
while (1)
{
m = check(image, array);
if (m == 0)
{
images[i] = ftell(image);
break;
}
number++;
if (m > 4)
{
fseek(image, -4, SEEK_CUR);
images[i] = ftell(image);
i++;
fseek(image, 512, SEEK_CUR);
}
else
{
fseek(image, 512 - m, SEEK_CUR);
}
}
fseek(image, images[0], SEEK_SET);
//printf("%li\n", ftell(image));
for (int j = 0; j < 50; j++)
{
if (j > 9)
{
sprintf(name, "0%i.jpg", j);
}
else
{
sprintf(name, "00%i.jpg", j);
}
FILE *new_image = fopen(name, "w");
BYTE example[512];
while (ftell(image) != images[j + 1])
{
fread(example, sizeof(BYTE), 512, image);
fwrite(example, sizeof(BYTE), 512, new_image);
//fseek(image, 512, SEEK_CUR);
}
FILE *new_read = fopen(name, "r");
fseek(new_read, 0, SEEK_SET);
BYTE variable;
if (check(new_read, array) > 4)
{
printf("GOOd\n");
}
else
{
fseek(new_read, 0, SEEK_SET);
fread(&variable, sizeof(BYTE), 1, new_read);
printf("%i\n", variable);
}
fclose(new_read);
fclose(new_image);
}
fclose(image);
}
但是,如果我将代码更改为:
fread(example, sizeof(BYTE), 512, image);
fwrite(example, sizeof(BYTE), 512, new_image);
其中“example”是一个长度为512的(uint8_t)数组,代码工作正常。有人能解释为什么吗?
1条答案
按热度按时间voj3qocg1#
这一行有错误。
fwrite
的第一个参数需要是一个 * 指向缓冲区的指针 *,如example
(然后写入由第四个参数new_image
提供的句柄标识的文件中)。这里您尝试做的是从image
(这是另一个 * 文件句柄 *,不是数据缓冲区)写入new_image
。image
并不指向文件数据。它是指向FILE
结构的指针,您不应该直接读取或写入该结构。(
FILE
是特定于实现的,但通常包含某种特定于操作系统的标识符--如POSIX上open()
返回的文件ID--指向可选文件缓冲区的指针,该缓冲区在任何给定时间可能被填充,也可能未被填充,以及用于标准库确定文件位置、缓冲区状态、错误标志等的几个数据位;它与文件的内容不同。)