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

元のファイルのサイズとコピーをバイト単位で確認すると、問題がわかります。

このコードはバイトを読み取り、バイトを書き込みます。

#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 に答える
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 に答える
0

私はあなたの最初のコードをコピーし、またあなたがこのコードをあなたのプログラムに追加する必要があるだけの最初の解決策を使用しました:fseek(str、0、SEEK_SET);そしてあなたのコピービットマップが生成されます。

于 2015-02-26T08:32:09.967 に答える