2
#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。

4

0 回答 0