C++ 关于seekp的这种看似奇怪的行为是否正确?

C++ 关于seekp的这种看似奇怪的行为是否正确?,c++,linux,macos,stream,fstream,C++,Linux,Macos,Stream,Fstream,编辑,抱歉,这个问题显然是重复的 要到达我的位置,首先触摸终端中的一个文件以创建一个空文件(linux或mac): 然后编译并执行这段代码 #include <fstream> #include <iostream> int main() { std::fstream stream("test.file", std::ios::in | std::ios::out | std::ios::binary); stream.seekp(5476547654

编辑,抱歉,这个问题显然是重复的


要到达我的位置,首先触摸终端中的一个文件以创建一个空文件(linux或mac):

然后编译并执行这段代码

#include <fstream>
#include <iostream>

int main()
{
    std::fstream stream("test.file", std::ios::in | std::ios::out | std::ios::binary);
    stream.seekp(54765476543); // arbitrarily large number
    std::cout<<"stream.tellp() "<<stream.tellp()<<std::endl;
    std::cout<<"stream.bad()? "<<stream.bad()<<std::endl;
    std::cout<<"stream.fail()? "<<stream.fail()<<std::endl;
    stream << "test";
    stream.flush();
    stream.close();
    return 0;
}
当我运行“ts”时,我得到输出:

stream.tellp() 54765476543
stream.bad()? 0
stream.fail()? 0
这就是我困惑的地方:我以为tellp()会给出'-1'(因为我正在试图寻找结束点),而stream.fail()至少会等于true。这种行为是未定义的还是我遗漏了什么

更奇怪的是当我这样做的时候

ls -lh test.file
我明白了

现在很明显,文件的大小不是54G。最后当我这么做的时候

cat test.file
要查看是否实际写入了任何内容,输出将挂起

上述行为正确吗

谢谢


Ben.

在文件末尾执行一个
seekp()
操作(然后可能写入)没有什么错

通过向前移动光标,您确实正在写入此文件


文件是否真的那么大(如果它是A)完全依赖于你的操作系统/文件系统:就C++而言,这是有效的。< /P>它是一个输出流,Sekp将从你的空测试中创建一个大小为54765476543的文件。触摸不可能是真的,因为驱动器的“DF”只显示了8字节的使用增加。(我可以通过增加寻道数来创建一个10TB的文件,至少根据ls-h,这远远超出了驱动器的容量)您不会看到磁盘使用量的大幅增加,因为它很可能是一个稀疏文件,请参阅。啊,我不知道文件系统可以进行这样的优化。这是有意义的。谢谢。

ls -lh test.file
-rw-r--r--  1 bjones  users    51G Aug 13 04:32 test.file
cat test.file