4

そこで、大学のスニペットから C ファイルの IO 操作を学ぼうとしています。私の問題は、SEEK_END期待どおりに機能しないことです。

詳細については、お会いしましょう。

入力.txt:

abcd-abcd-abcd

コード:

int fd, fdr, l1, l2, wb1, wb2;
char buf[25];

fd = open("input.txt", O_WRONLY);
fdr = open("input.txt", O_RDONLY);

l1 = lseek(fd, -3, SEEK_END);
wb1 = write(fd, "xy", 2);

l2 = lseek(fd, 4, SEEK_SET);
write(fd, "12", 2);

lseek(fdr, 0, SEEK_SET);
wb2 = read(fdr, buf, 20);
write(1, buf, wb2);

私の問題は「xy」を書くことです。出力が

abcd12bcd-axyd

代わりに

abcd12bcd-abcd

「xy」が書かれていないのはなぜですか?

4

2 に答える 2

0

再度読み取る前に、データをディスクに同期する必要があります。読み取り時にデータが書き込まれないためです。読む前にファイルを閉じる必要があります。

于 2013-11-20T09:01:59.537 に答える
0

別のハンドルからファイルを読み取る前に、書き込み専用ファイルを閉じます (またはデータをディスクに同期します)。

あなたの場合、データはファイルに書き込まれますが、まだディスクに同期されていません。そのため、2 番目のハンドルがデータを読み取ろうとすると、古い古いデータが取得されます。

int fd, fdr, l1, l2, wb1, wb2;
char buf[25];

fd = open("input.txt", O_WRONLY);
fdr = open("input.txt", O_RDONLY);

l1 = lseek(fd, -3, SEEK_END);
wb1 = write(fd, "xy", 2);

l2 = lseek(fd, 4, SEEK_SET);
write(fd, "12", 2);

close(fd); 

lseek(fdr, 0, SEEK_SET);
wb2 = read(fdr, buf, 20);
write(1, buf, wb2);
于 2013-11-20T09:01:18.310 に答える