9

この質問は非常に単純なようですが、プラットフォームに依存せずにCでファイルをコピーするための明確な解決策を見つけることができません。

オープンソースプロジェクトでsystem()呼び出しを使用して、ディレクトリを作成し、ファイルをコピーして、外部プログラムを実行しました。Mac OS Xやその他のUnix風のシステムでは非常にうまく機能しますが、Windowsでは失敗します。問題は次のとおりです。

system( "cp a.txt destination/b.txt" );
  • Windowsは、パス区切り文字に円記号を使用します。(Unix風のスラッシュとの比較)
  • Windowsは、内部コピーコマンドに「copy」を使用します。(Unix風のcpとの比較)

依存関係のないコピーコードを作成するにはどうすればよいですか?

(実際、私はこの問題を解決するためにマクロを作成しましたが、それはクールではありません。http: //code.google.com/p/npk/source/browse/trunk/npk/cli/tests/testutil.h、L22-56)

4

3 に答える 3

9

このsystem()関数は、その価値よりもはるかに厄介です。別のプロセスでシェルを呼び出すため、通常は回避する必要があります。

代わりに、、fopen() a.txtおよび/をdest/b.text使用してコピーを実行します(標準ライブラリはあなたよりもページ整列バッファリングを実行する可能性が高いため)getc()putc()

FILE *src = fopen("a.txt", "rb");
FILE *dst = fopen("dest/b.txt", "wb");
int i;
for (i = getc(src); i != EOF; i = getc(src))
{
    putc(i, dst);
}
fclose(dst);
fclose(src);
于 2011-07-24T15:57:29.500 に答える
6

stdio.hのC標準ライブラリ関数を使用する必要があります。

特に、、、、、でfopen十分ですfreadfwritefclose

のフラグには、必ずb( "binary")オプションを含めてくださいfopen

[編集]

残念ながら、ファイル名自体(スラッシュとバックスラッシュ)は依然としてプラットフォームに依存します。#ifdefしたがって、それに対処するには、ある種のまたは類似のものが必要になります。

または、クロスプラットフォームツールキットを使用できます。

于 2011-07-24T15:50:56.713 に答える
0

標準Cライブラリを使用しますstdio.h。まず、を使用して読み取り用に入力ファイルをfopen(inputFilename, "rb")開き、を使用して書き込み用に出力ファイルを開き、およびを使用fopen(outputFilename, "wb")してコンテンツをコピーします。次に、を使用して両方のファイルを閉じます。freadfwrirefclose

于 2011-07-24T15:53:09.667 に答える