1

私は C が初めてで、ファイルの基本を学べるようにファイルをコピーするだけのプログラムを書こうとしていました。私のコードはファイルを入力として取り、fseek と ftell を使用して、ファイルの開始点と終了点を差し引いてその長さを計算します。次に、fwrite を使用して、man ページから取得できるものに基づいて、データの 1 つの要素、(END - START) 要素の長さを、OUT が指すストリームに書き込み、FI によって指定された場所からそれらを取得します。問題は、「コピー出力」は生成されますが、ファイルが元のファイルと同じではないことです。私は何を間違っていますか?入力ファイルを変数に読み込んでから、そこから書き込もうとしましたが、それも役に立ちませんでした。私は何を間違っていますか?ありがとう

int main(int argc, char* argv[])
{ 
    FILE* fi = fopen(argv[1], "r"); //create the input file for reading

    if (fi == NULL)
        return 1; // check file exists

    int start = ftell(fi); // get file start address

    fseek(fi, 0, SEEK_END); // go to end of file

    int end = ftell(fi); // get file end address

    rewind(fi); // go back to file beginning

    FILE* out = fopen("copy output", "w"); // create the output file for writing

    fwrite(fi,end-start,1,out); // write the input file to the output file
}

これは機能するはずですか?

{
    FILE* out = fopen("copy output", "w");
    int* buf = malloc(end-start);  fread(buf,end-start,1,fi);
    fwrite(buf,end-start,1,out);
}
4

4 に答える 4

9

これはうまくいきませんfwrite

ファイルをコピーするには、通常、バッファーを割り当ててから、 を使用freadして 1 つのバッファーのデータを読み取り、続いてfwriteそのデータを書き戻します。ファイル全体をコピーするまで繰り返します。典型的なコードは、次の一般的な順序です。

#define SIZE (1024*1024)

char buffer[SIZE];
size_t bytes;

while (0 < (bytes = fread(buffer, 1, sizeof(buffer), infile)))
    fwrite(buffer, 1, bytes, outfile);
于 2013-01-04T02:57:58.417 に答える
1

おそらく、Cのオープンソースコピーツールを見ると、正しい方向を示しているでしょう。

于 2013-01-04T02:59:56.593 に答える
1

fwrite の最初のパラメーターは、ファイルから読み取る FILE* ではなく、ファイルに書き込まれるデータへのポインターです。最初のファイルからバッファにデータを読み取ってから、そのバッファを出力ファイルに書き込む必要があります。http://www.cplusplus.com/reference/cstdio/fwrite/

于 2013-01-04T02:57:49.067 に答える