c++中对文件的io流和io迭代器是不是有什么定义顺序要求?请看下面的小程序

int main()
{
/*cout<<"enter some integers :"<<endl;
istream_iterator<int> iiter(cin),eof;
*/
string filename1,filename2;
cout<<"enter the filename1 and filename2 :"<<endl;
cin>>filename1>>filename2;

cout<<"enter some integers :"<<endl;
istream_iterator<int> iiter(cin),eof;//这样是正确的,可以写到文件中,但是把这两句写到前面却不能写入了,为什么???

ofstream output1(filename1,ios::app);
ofstream output2(filename2,ios::app);

if(!output1||!output2)
{
cerr<<"can not open output file!"<<endl;
return EXIT_FAILURE;
}
ostream_iterator<int> ofiter1(output1," ");
ostream_iterator<int> ofiter2(output2,"\n");
while(iiter!=eof)
{
if(*iiter%2==0)
{
*ofiter1=*iiter;
++ofiter1;
}
else
{
*ofiter2=*iiter;
++ofiter2;
}
++iiter;
}
output1.close();
output2.close();
}
是不是要求输入流要在文件打开后才可以定义?

我调试了下
istream_iterator<int> iiter(cin)解开等于

istream_iterator(istream_type& _Istr)
: _Myistr(&_Istr)
{ // construct with input stream
_Getval();
}

_GetVal()解开等于
void _Getval()
{ // get a _Ty value if possible
if (_Myistr != 0 && !(*_Myistr >> _Myval))
_Myistr = 0;
}

看得出,初始化流迭代器,流构造函数会读取流的第一个元素.存放在_Myval里
也就是一创建这个迭代器,就需要读取一个元素<int>,而你要求首选是输入文件名.

当你调用*iter,流迭代器会返回const 类型的 _Myval引用.
当你调用iter++,迭代器会从cin中读取下一个元素到_Myval.
----------------------------------输入缓冲区----------------------------
istream_iterator<int> iiter(cin)放在前面

filename1.txt filename2.txt 1 2 3 4 5 6 7 8

istream_iterator<int> iiter(cin)放在后面

filename1.txt filename2.txt 1 2 3 4 5 6 7 8

能问下楼主看得什么书吗?感觉不错.我也想去看下.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-22
流迭代器需要一个流,文件没有打开前,还不是合法的流,因此要求先打开是比较合理的追问

但是 cout iiter(cin),eof;这并没有用到文件啊??只是把这两句放到文件打开的前面却不能写入文件???为什么? 别的例子中用这迭代器直接初始化vector都行的。。请回复。。

追答

流有很多种,标准输入也是合法的流,但是和文件无关

追问

嗯,问题就在这。 上面的程序 把这两句标准输入放到前面却 写入txt文件不成功了。怎么解释这个问题??

追答

我估计是在前面cin>>filename1>>filename2;时流内遗留了一些字符
如果你在前面定义cin,这些遗留字符不会被删除,而在后面定义则开始定义时刷新缓冲区删除了
这样在后面的循环种,这些遗留字符破坏了循环的条件,使得它进入异常状态

另外一个奇怪的事情是:你定义了一个叫eof的iterator,没有给它赋值,但是为什么后面直接和它比较?

追问

哦 刚刚那位帮我解决了。eof空迭代器是用做结束迭代器。 谢谢你哈。

第2个回答  2012-07-22
不知道
相似回答