C语言 无法使用fwrite()将数据从一个文件正确复制到另一个文件

xyhw6mcr  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(144)

“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)数组,代码工作正常。有人能解释为什么吗?

voj3qocg

voj3qocg1#

fwrite(image, sizeof(BYTE), 512, new_image);

这一行有错误。fwrite的第一个参数需要是一个 * 指向缓冲区的指针 *,如example(然后写入由第四个参数new_image提供的句柄标识的文件中)。这里您尝试做的是从image(这是另一个 * 文件句柄 *,不是数据缓冲区)写入new_image
image并不指向文件数据。它是指向FILE结构的指针,您不应该直接读取或写入该结构。
FILE是特定于实现的,但通常包含某种特定于操作系统的标识符--如POSIX上open()返回的文件ID--指向可选文件缓冲区的指针,该缓冲区在任何给定时间可能被填充,也可能未被填充,以及用于标准库确定文件位置、缓冲区状态、错误标志等的几个数据位;它与文件的内容不同。)

相关问题