fstream和seekg没有按预期运作

时间:2015-12-18 19:04:43

标签: c++ c++11 seekg

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main(){

    fstream input("EX17.39file.txt", fstream::ate | fstream::out | fstream::in);

    if(!input){
        cout << "Failed to open file. Exiting." << endl;
        return EXIT_FAILURE;
    }

    auto end_mark = input.tellp();
    input.seekg(0, fstream::beg);

    for(string line; getline(input, line);){

        auto read_mark = input.tellg();

        input.seekp(0, fstream::end);
        input.seekg(read_mark);

        char c;
        while(input >> c)
        cout << c << " ";

    }


}

while循环的所有内部实际上都是从当前位置移动到结束位置,然后返回到当前位置。然后它输出流中剩下的每个字符。除了输入文件之类的:

abcd
efg
//newline

我的输出是

f g

我发现错过e很奇怪。如果我移动循环的一部分,在input.seekp(0, fstream::end);命令之前输出剩​​余的流,即

for(string line; getline(input, line);){

        auto read_mark = input.tellg();

        char c;
        while(input >> c)
        cout << c << " ";

        input.clear();
        cout << endl;

        input.seekp(0, fstream::end);
        input.seekg(read_mark);     

}

然后e f g得到正常的输出。因此,当流被放置到最后,然后回到原来的位置时,由于某种原因,它没有被放置在正确的位置并且错过了e

如果我将所有内容从fstream更改为字符串流:

stringstream input("abcd\nefg\n", fstream::ate | fstream::out | fstream::in);

然后输出就像我期望的那样。

为什么seekg(read_mark)没有将其恢复到原来的位置? (mingw64 gcc 5.2.0)。

在移动前编辑:input.tellg(),移动后input.tellg()输出相同的值7.

0 个答案:

没有答案