まず第一に、あなたが書いたコードは移植性がありません。プラットフォームに完全に依存しない方法があるのに、なぜ OS 固有の関数を使用するのでしょうか。これは、ヘッダー ファイルを 1 つだけ使用するバージョンで、C 標準ライブラリを実装するすべてのプラットフォームに移植できます。
#include <stdio.h>
int main(int argc, char **argv)
{
FILE* sourceFile;
FILE* destFile;
char buf[50];
int numBytes;
if(argc!=3)
{
printf("Usage: fcopy source destination\n");
return 1;
}
sourceFile = fopen(argv[1], "rb");
destFile = fopen(argv[2], "wb");
if(sourceFile==NULL)
{
printf("Could not open source file\n");
return 2;
}
if(destFile==NULL)
{
printf("Could not open destination file\n");
return 3;
}
while(numBytes=fread(buf, 1, 50, sourceFile))
{
fwrite(buf, 1, numBytes, destFile);
}
fclose(sourceFile);
fclose(destFile);
return 0;
}
編集:glibc リファレンスには次のように書かれています:
<ブロック引用>一般に、ファイル ディスクリプタでしか実行できない特定の操作がない限り、ファイル ディスクリプタではなくストリームを使用することに固執する必要があります。フォーマットされた入力関数 (フォーマットされた入力を参照) とフォーマットされた出力関数 (フォーマットされた出力を参照)。
GNU 以外のシステムへのプログラムの移植性について懸念がある場合は、ファイル記述子はストリームほど移植性がないことにも注意する必要があります。 ISO C を実行しているシステムはストリームをサポートすることを期待できますが、非 GNU システムはファイル記述子をまったくサポートしないか、ファイル記述子で動作する GNU 関数のサブセットのみを実装する場合があります。ただし、GNU ライブラリのファイル記述子関数のほとんどは POSIX.1 標準に含まれています。
read() データを新しいファイルに write() する必要があります:
ssize_t nrd;
int fd;
int fd1;
fd = open(aa[1], O_RDONLY);
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,50)) {
write(fd1,buffer,nrd);
}
close(fd);
close(fd1);
更新:適切な開口部を追加しました...
ところで、O_CREAT は論理和 (O_CREAT | O_WRONLY) にすることができます。実際に開いているファイル ハンドルが多すぎます。開くのは 1 回だけです。
write
を実行する必要があります read
と同じループで .