我试图在文件中的第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的奇怪行为?
答案 0 :(得分:9)
"ab"
模式意味着每次写入都将附加到文件中,无论写入前的位置如何。
如果您不想这样,请不要使用"a"
标志。
稍后添加:
如果您要打开现有文件进行更新,则"r+b"
会打开文件进行读写; "w+b"
在文件打开时截断文件,但允许您阅读您所写的内容。
C99标准(ISO / IEC 9899:1999 - 不是现行标准,但非常相似)说:
§7.19.5.3
fopen
函数
r
- 用于阅读的开放文本文件w
- 截断为零长度或创建用于编写的文本文件a
- 追加;打开或创建文本文件,以便在文件结尾处写入rb
- 打开二进制文件进行阅读wb
- 截断为零长度或创建用于编写的二进制文件ab
- 追加;打开或创建二进制文件以便在文件结尾处写入r+
- 用于更新(读写)的开放文本文件w+
- 截断为零长度或创建文本文件以进行更新a+
- 追加;打开或创建文本文件以进行更新,在文件结尾处写入r+b
或rb+
- 打开二进制文件进行更新(读写)w+b
或wb+
- 截断为零长度或创建二进制文件以进行更新a+b
或ab+
- 追加;打开或创建二进制文件以进行更新,在文件结尾处写入
答案 1 :(得分:5)
以“ab”模式打开将导致您在文件末尾添加字节,您需要使用“wb”模式来覆盖字节。