两次使用copy为什么出现这么个结果
#include <map>
#include <iterator>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <algorithm>
using namespace std;
class comp_length{
public:
bool operator()(const string& st1, const string& st2)
{
return st1.length() <st2.length()?true:false;
}
};
int main(int argc,char* argv[])
{
int ix;
ifstream in_file( "text.txt ");
if(!in_file)
{
cerr < < "unable to open the necessary files.\n ";
return -1;
}
istream_iterator <string> is(in_file);
istream_iterator <string> eof;
vector <string> svec;
vector <string> svec1;
copy(is,eof,back_inserter(svec));
copy(is,eof,back_inserter(svec1));
int svec_size=svec.size();//真实统计了字符串个数
int svec_size1=svec1.size();//这里只统计出第一个,大小为1
for(ix=0;ix <svec_size1;ix++)
cout < <svec1[ix] < < ' ';//输出的是第一个
cout < <endl;
}
出现这种情况怎么回事?难道eof往前走了,但是eof其实是0xccccccccc啊
[解决办法]
改
int main(int argc,char* argv[])
{
int ix;
ifstream in_file( "t.txt ");
if(!in_file)
{
cerr < < "unable to open the necessary files.\n ";
return -1;
}
istream_iterator <string> is(in_file);
istream_iterator <string> eof;
vector <string> svec;
vector <string> svec1;
int t = in_file.tellg();
copy(is,eof,back_inserter(svec));
in_file.clear();
in_file.seekg( t, ios_base::beg );
copy(is,eof,back_inserter(svec1));
int svec_size=svec.size();//真实统计了字符串个数
int svec_size1=svec1.size();//这里只统计出第一个,大小为1
for(ix=0;ix <svec_size1;ix++)
cout < <svec1[ix] < < ' ';//输出的是第一个
cout < <endl;
}
[解决办法]
经过星羽的启发!察看了istream_iterator的源码,找到问题所在:
1.istream_iterator类在构造时会读取一个一个string测试文件。
2.copy过程中文件指针移动了,第一个copy就到了末尾。
3.第二个copy中*is等于第一个字符串,所以copy后只有一个开头字符。
如果在第二个copy前加入cout < <*is < <endl;第二个copy就是空的!
这是我的理解!