c++中对文件的io流和io迭代器是不是有什么定义顺序要求?请看下面的小程序
intmain(){/*cout<<"entersomeintegers:"<<endl;istream_iterator<int>iiter(cin),eof;*/st...
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();
}
是不是要求输入流要在文件打开后才可以定义? 展开
{
/*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();
}
是不是要求输入流要在文件打开后才可以定义? 展开
3个回答
展开全部
我调试了下
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
能问下楼主看得什么书吗?感觉不错.我也想去看下.
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
能问下楼主看得什么书吗?感觉不错.我也想去看下.
展开全部
流迭代器需要一个流,文件没有打开前,还不是合法的流,因此要求先打开是比较合理的
更多追问追答
追问
但是 cout iiter(cin),eof;这并没有用到文件啊??只是把这两句放到文件打开的前面却不能写入文件???为什么? 别的例子中用这迭代器直接初始化vector都行的。。请回复。。
追答
流有很多种,标准输入也是合法的流,但是和文件无关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询