2

ファイルの位置4で4バイトをオーバーライドしようとしていますが、fseekが機能していないようです。

私のコード:

int r = fseek(cacheStream, 4, SEEK_SET);
std::cout << "fseek returns " << r << std::endl;
std::cout << "ftell " << ftell(cacheStream) << std::endl;
r = fwrite(&chunckSize, sizeof(uint32_t), 1, cacheStream);
std::cout << "fwrite returns " << r << std::endl;
std::cout << "ftell " << ftell(cacheStream) << std::endl;

cacheStreamは「ab」で開いていました。出力は次のとおりです。

fseek returns 0
ftell 4
fwrite returns 1
ftell 2822716

値はオーバーライドされませんでしたが、代わりにファイルの最後に書き込まれました。fseekでその奇妙な動作を引き起こす可能性があるのは何ですか?

4

2 に答える 2

8

この"ab"モードは、書き込み前の位置に関係なく、すべての書き込みがファイルに追加されることを意味します。

それを望まない場合は、"a"フラグを使用しないでください。

後で追加

更新のために既存のファイルを開いている場合は"r+b"、読み取りと書き込みのためにファイルを開きます。"w+b"開いたときにファイルを切り捨てますが、書き込んだ内容を読み取ることができます。

C99規格(ISO / IEC 9899:1999 —現在の規格ではありませんが、非常によく似ています)は次のように述べています。

§7.19.5.3fopen関数

  • r—読むためにテキストファイルを開く
  • w—長さをゼロに切り捨てるか、書き込み用のテキストファイルを作成します
  • a—追加; ファイルの終わりに書き込むためのテキストファイルを開くか作成します
  • rb—読み取り用にバイナリファイルを開く
  • wb—長さをゼロに切り捨てるか、書き込み用のバイナリファイルを作成します
  • ab—追加; ファイルの終わりに書き込むためのバイナリファイルを開くか作成します
  • r+—更新用にテキストファイルを開く(読み取りと書き込み)
  • w+—長さをゼロに切り捨てるか、更新用のテキストファイルを作成します
  • a+—追加; 更新用のテキストファイルを開くか作成し、ファイルの終わりに書き込みます
  • r+b または rb+—更新(読み取りおよび書き込み)のためにバイナリファイルを開く
  • w+b または wb+—長さをゼロに切り捨てるか、更新用のバイナリファイルを作成します
  • a+b または ab+—追加; 更新用のバイナリファイルを開くか作成し、ファイルの終わりに書き込みます
于 2013-02-26T17:18:06.203 に答える
5

「ab」モードで開くと、ファイルの最後にバイトが追加されます。バイトを上書きするには、代わりに「wb」モードを使用する必要があります。

于 2013-02-26T17:23:46.720 に答える