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