0

我想在 c 中创建文件(.bmp)的精确副本

#include<stdio.h>

int main()
{
    FILE *str,*cptr;

    if((str=fopen("org.bmp","rb"))==NULL)
    {
        fprintf(stderr,"Cannot read file\n");
        //return 1;
    }

    if((cptr=fopen("copy.bmp","wb"))==NULL)
    {
        fprintf(stderr,"Cannot open output file\n");
        //return 1;
    }

    fseek(str, 0, SEEK_END);
    long size=ftell(str);
    printf("Size of FILE : %.2f MB \n",(float)size/1024/1024);
    char b[2];

    for(int i=0;i<size;i++)
    {
        fread(b,1,1,str);
        fwrite(b,1,1,cptr);
    }

    fseek(cptr, 0, SEEK_END);
    long csize=ftell(str);
    printf("Size of created FILE : %.2f MB \n",(float)csize/1024/1024);
    fclose(str);
    fclose(cptr);

    return 0;
}

尽管它创建了一个相同大小的文件,但 windows 在尝试查看新创建的位图副本时会引发错误。为什么会这样?

4

5 回答 5

8

在开始阅读之前,您已将输入文件的文件指针移动到文件末尾。您需要将其还原到开头。

改变:

fseek(str, 0, SEEK_END);
long size=ftell(str);

至:

fseek(str, 0, SEEK_BEGIN);
long size=ftell(str);
fseek(str, 0, SEEK_SET);

请注意,您的代码没有错误检查 - 如果您至少检查了结果,fread那么您的错误将立即显而易见。带回家的信息:在检查错误时不要偷工减料 - 它会在以后支付红利。

于 2012-05-10T13:51:53.840 回答
3

您需要回到原始文件的开头,因为您不断地在 EOF 处读取,因此不会复制文件内容,只是 b[] 数组中发生的任何事情。

您没有检查 fread() 和 fwrite() 的返回码。如果您一直这样做,您可能已经从返回码中解决了这个问题。

于 2012-05-10T13:51:47.943 回答
1

这是一个复制文件的好功能!复制charchar读取整个文件要好,因为结果(如果文件太长)是缓冲区溢出!

double copy(char *input, char *output) {
    FILE *f_in = fopen(input, "r");
    FILE *f_out = fopen(output, "a");
    if (!f_in || !f_out) {
        fclose(f_in);
        fclose(f_out);
        return -1;
    }
    int c;
    while ((c = fgetc(f_in)) != EOF)
        fputc(c, f_out);
    fclose(f_in);
    fseek(f_out, 0, SEEK_END);
    long size = ftell(f_out);
    fclose(f_out);
    return (double)(size / 1024 / 1024); // MB
}

此函数返回输出文件的 MB。如果不成功,则返回0

像这样使用这个函数:

double output;
if ((output = copy("What ever you want to copy", "Where ever it should be printed")) != -1)
    printf("Size of file: %lf MB.\n", output);

希望这会有所帮助:)

于 2012-05-10T16:01:24.043 回答
1

如果您检查原始文件的大小和以字节为单位的副本,它应该会告诉您问题。

此代码读取一个字节并写入一个字节。

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define KB 1024

int main()
{
    unsigned int ifd,ofd,rcnt;
    char buf[KB];

    ifd=open("orig.jpg",O_RDONLY);
    if(ifd==0)
    {
        fprintf(stderr,"Cannot read file\n");
        //return 1;
    }

    ofd=open("copy.jpg",O_WRONLY|O_CREAT);
    if(ofd==0)
    {
        fprintf(stderr,"Cannot open output file\n");
        //return 1;
    }

    while(rcnt=read(ifd,buf,KB))
        write(ofd,buf,rcnt);
}

~

于 2012-05-10T14:06:36.877 回答
0

我复制了您的第一个代码并使用了第一个解决方案,您只需将此代码添加到您的程序中:fseek(str, 0, SEEK_SET);然后您的复制位图就会生成。

于 2015-02-26T08:32:09.967 回答