1) 構造体があり、fwrite() ではなく、write() システム コールを使用してファイルに書き込む必要があります。これは可能ですか?
2)構造をファイルに書き込んだ後、別のファイルを読み取り、構造が現在書き込まれているファイルの最後に書き込む必要があります。
どんな助けでも大歓迎です。
1) 構造体があり、fwrite() ではなく、write() システム コールを使用してファイルに書き込む必要があります。これは可能ですか?
2)構造をファイルに書き込んだ後、別のファイルを読み取り、構造が現在書き込まれているファイルの最後に書き込む必要があります。
どんな助けでも大歓迎です。
これにより、構造がファイルに書き込まれます。
int fd = open(file, O_WRONLY);
struct my_struct a;
write(output, &a, sizeof(struct my_struct));
もう一方のファイルについては、単純にそれを開き、その内容をループで読み取り、前のファイルに書き込みます。
int fd2 = open(otherfile, O_RDONLY);
int readret;
char buf[4096];
while ((readret = read(fd2, buf, sizeof(buf) != 0) {
write(fd, buf, readret);
}
(コメントで言及されているように)すべての書き込み/読み取り結果をテストし、それらのエラーを処理することを忘れないでください。
構造をバイナリで記述することについて話している場合は、そうです。K&R で説明されている関数の使用法は次のとおりです。
int n_written = write( int fd, char *buf, int n );
したがって、次のようになります。
struct mystruct s;
write( fd, (char*)&s, sizeof(s) );
構造体をテキストでシリアル化する場合は、sprintf
または同様の方法でフォーマットされた文字列を作成し、それをファイルに書き出す必要があります。
ここで、別のファイルを読み込んで、構造体をダンプしたばかりのファイルに書き出す必要があります。と を使用read
しwrite
て、一度にデータのチャンクを移動します。合理的な方法は、ディスク セクタ サイズの倍数のチャンクを移動することです (伝統的には 512 バイトですが、最近では一般性のために 4096 のような値を使用することをお勧めします)。
write と fwrite は同じように機能しますが、唯一の違いは、write がファイル デストリプタ (fd) を使用することです。ここで、fwrite は FILE * を使用します。
あなたが宣言したと仮定して
struct somestruct_st mydata;
あなたはそれを書くことができます
ssize_t cnt = write (yourfd, &mydata, sizeof(mydata));
if (cnt != sizeof(mydata)) {
// handle that case
}