fseek在写入值时返回到文件末尾

时间:2013-02-26 17:15:06

标签: c++ c fseek

我试图在文件中的第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的奇怪行为?

2 个答案:

答案 0 :(得分:9)

"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+ - 追加;打开或创建二进制文件以进行更新,在文件结尾处写入
  •   

答案 1 :(得分:5)

以“ab”模式打开将导致您在文件末尾添加字节,您需要使用“wb”模式来覆盖字节。