在文件之外的上下文中,seekp的正确行为是什么

时间:2015-10-28 19:33:36

标签: c++ fstream

执行以下代码

后文件的内容应该是什么
int main (int, char**) {

    std::string s1 {"Hello world"};
    std::string s2 {"x"};

    std::fstream f {"file1", std::ios_base::out};
    f.write (s1.data (), s1.size ());
    f.seekp (10, std::ios_base::end);
    f.write (s2.data (), s2.size ());

    return 0;
}

我的意思是应该在“旧”之间放置什么?文件结尾和' new'文件结束。我将写入光标位置改为超出文件末尾。那么,应该使用哪些字符作为履行。

执行后,我使用cat,vim和Kate读取文件。输出是:

Hello worldx                       # cat
Hello world^@^@^@^@^@^@^@^@^@^@x   # vim
Hello worldx                       # Kate**

**在d和x之间的文本编辑器中有很多空格字符。凯特展示了这个文件包含无效字符的描述。

1 个答案:

答案 0 :(得分:2)

首先是好消息:

您系统上发生的事情可能就是您所期望的 - 将10个字节的零值写入您的文件以填补“差距”。 (或者它们在内存页面中已经为零,这只是运气)。

^@CTRL-@的简写。在ASCII系统中,CTRL键从您按下的键的ASCII代码中减去十进制64。 @是ASCII码64或0x40。

现在是坏消息:

c ++标准对此事无话可说,底层C API也没有。所以你所做的事情可能不是便携式的 - 除非你不关心那些字节的值。