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 回答