同じ方法でファイルを必要としないため、ファイルをコピーするためのユーティリティー機能は見つかりません。それは 'スペアパーツ'から構築することができます。 unlink()
やsymlink()
のような関数は、他の関数の点では構築できませんが、仮説のあるcopy_file()
などの関数はそうすることができます。
void fcopy(FILE *f1, FILE *f2)
{
char buffer[BUFSIZ];
size_t n;
while ((n = fread(buffer, sizeof(char), sizeof(buffer), f1)) > 0)
{
if (fwrite(buffer, sizeof(char), n, f2) != n)
err_syserr("write failed\n");
}
}
err_syserr()
関数は、引数として渡された文字列とにより暗示エラーメッセージを含むエラー報告のためである:あなたが使用することができ、読み書き用f2
ためf1
を2つの開いているファイル・ストリームを考えると
errno
*;それは返されません。 BUFSIZ
は<stdio.h>
で定義されていますが、より大きな値を使用することもできます。そのようなレポートをエラーにしたくないかもしれませんが、関数が成功すれば0を、失敗した場合は-1を返すことを望みます。
int fcopy(FILE *f1, FILE *f2)
{
char buffer[BUFSIZ];
size_t n;
while ((n = fread(buffer, sizeof(char), sizeof(buffer), f1)) > 0)
{
if (fwrite(buffer, sizeof(char), n, f2) != n)
return -1;
}
return 0;
}
この関数はファイルを開かないため、ファイルを閉じることもないので注意してください。つまり、複数の入力ファイルを1つの出力ファイルに連結するために使用することができます。ラッパー関数を使用して、ファイルを読み取り用に、別のファイルを書き込み用に開くことができます。
*実は、err_syserr()
は、書式文字列と他の引数を取り、次に説明して終了などのエラーメッセージを報告printf()
のような機能があります。
ファイルのコピーはかなり時間がかかり、複雑な操作です。 OSが(Windowsのような)システムライブラリの 'CopyFile'機能を持っている場合でも、これは_システムコールとして実装されるのではなく、ユーティリティ機能として実装されます。コピーを作成するにはいくつかの方法がありますが、UN * Xはこれを決してあまり明白にしていません。つまり、ファイルコピーを作成するためのゴールデンパスとして 'copy() 'を販売します。 –