编辑,道歉,这个问题显然与failbit not being set when seekg seeks past end of file (C++,Linux)
重复要到达我所在的位置,首先触摸终端中的文件以创建一个空文件(linux或mac):
touch test.file
然后编译并执行此代码
#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;
}
使用您最喜欢的c ++编译器(我尝试使用Apple LLVM版本4.2(clang-425.0.28)用于clang ++和i686-apple-darwin11-llvm-g ++ - 4.2用于g ++和g ++(Debian 4.7.2-5)在linux上)
E.g。
clang++ testStream.cpp -o ts
当我运行'ts'时,我得到输出:
stream.tellp() 54765476543
stream.bad()? 0
stream.fail()? 0
这就是我的困惑所在:我认为tellp()会给'-1'(因为我试图寻找过去的结果),而stream.fail()至少会等同于true。这种行为是不确定的还是我错过了什么?
更奇怪的是,当我做的时候
ls -lh test.file
我得到了
-rw-r--r-- 1 bjones users 51G Aug 13 04:32 test.file
现在显然该文件的大小不是54G。最后我做的时候
cat test.file
看看是否有任何实际写入,输出只是挂起。
上述行为是否正确?
谢谢,
本。
答案 0 :(得分:3)
在文件末尾执行seekp()
之后没有错误(可能会写入文件)
你真的是通过向前移动光标来编写这个文件。
文件真的是否那么大(如果它是sparse file)完全取决于你的操作系统/文件系统:就C ++而言,这是有效的。< / p>