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