读书人

关于文件传输的getline( )函数疑点

发布时间: 2013-03-26 09:54:34 作者: rapoo

关于文件传输的getline( )函数疑问
本帖最后由 IMCNS 于 2013-03-19 23:22:28 编辑


#include <iostream>
#include <string>
#include <fstream>

int main()
{
std::fstream file("ex12.txt",std::fstream::ate|std::fstream::out|std::fstream::in);
if(!file){
std::cerr<<"could not open the file"<<std::endl;
throw std::runtime_error("could not open the file");
}

std::string sentences="123 321 1234567";

file<<sentences<<std::endl;//去掉std::endl以后while里面没有数据输入

file.seekg(0,std::fstream::beg);
while (getline(file,sentences)){
std::fstream::pos_type mark=file.tellg();
file.seekp(0,std::fstream::end);
file<<sentences.size()<<" ";
//我用file.seek(mark)回到mark位置为什么循环可以正常中止?
file.seekg(mark);
}
file.close();

system ("pause");
return 0;
}


疑问就是我的while循环里面明明用file<<sentences.size()<<" ";
添加了数据在文件末尾,然后再用file.seekg(mark)回到我mark的位置,为什么while循环还是可以照常结束?
理论上这不应该是个死循环吗? 相反的是我把file.seekg(mark)去掉以后这个循环才变成死循环...为什么?这个跟getline( )函数的返回值有关吗?

还有一个问题就是我file<<sentences<<std::endl;
这个语句,我把<<std::endl去掉以后,虽然有执行while循环,
却没有执行while循环里面的file<<sentences.size()<<" ";
为什么?

求教各位前辈帮小弟解答一下疑问...感激不尽啊..困扰了好久
[解决办法]
两个问题都在于endl。如果不加endl,缓冲区中可能出现问题,会导致你那个mark地址发生错乱。在while循环里那个改为file<<sentences.size()<<" "<<std::endl;每次写完数据后显式刷新,就能达到你的目的。

读书人网 >C++

热点推荐