首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

两次使用copy为什么出现这么个结果解决方案

2012-02-28 
两次使用copy为什么出现这么个结果#includemap#includeiterator#includefstream#includeiostream#

两次使用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就是空的!

这是我的理解!

热点排行