关于搜索是否正确,这看似奇怪的行为?

时间:2014-08-13 08:45:14

标签: c++ linux macos stream fstream

编辑,道歉,这个问题显然与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

看看是否有任何实际写入,输出只是挂起。

上述行为是否正确?

谢谢,

本。

1 个答案:

答案 0 :(得分:3)

在文件末尾执行seekp()之后没有错误(可能会写入文件)

你真的是通过向前移动光标来编写这个文件。

文件真的是否那么大(如果它是sparse file)完全取决于你的操作系统/文件系统:就C ++而言,这是有效的。< / p>