如何迭代输入迭代器

时间:2013-06-07 17:26:56

标签: c++ io

我需要编写一个函数,它接受输入迭代器和输出迭代器并读取输入流直到完成(我的第一个想法是输入流迭代器将是一个要读取的文件 - 所以当文件内容完全读取时将完成)然后功能将返回。

在这个简单的实验中,从文本文件中读取的字符只会输出到stdout。

我的问题是我不知道如何:

A)如何迭代输入

B)检查迭代器何时到达输入的末尾。

C)发生错误时。

到目前为止,这是我的代码:

#include <iostream>
#include <fstream>
#include <iterator>


bool readTo(std::istream_iterator<char> iit, std::ostream_iterator<char> oit)
{
   bool ret(false);

   // how to check when end of input file? 

   // how to iterate through input

   // how to check if an error?

   char ch = *iit;
   *oit++ = 'c';
   *oit++ = '=';
   *oit++ = ch;
   *oit++ = '\n';

   return ret;
}

int main() {

   std::ifstream strm("test.txt");
   if(strm.good()) {
       bool ret = readTo(strm, std::cout);
       //I only want function to return when readTo read till end of input file 
   }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。这有点抽象,所以花了我一段时间。

std库迭代器作为范围在迭代器上工作。为了灵活性,您可以传入整个容器,如:vec.begin(),vec.end()或某些子集。但是在输入迭代器的情况下该怎么办?结局是什么?那么你创建一个未初始化的迭代器。

std::ifstream strm("test.txt");
std::ifstream theend;
if(strm.good()) {
   bool ret = readTo(strm, theend, std::cout);
}

然后在readTo()中执行此操作:

void readTo(std::istream_iterator<char> iit, std::istream_iterator<char> the_end, 
        std::ostream_iterator<char> oit)

   while(iit != the_end) {
     char ch = *iit;
     *oit++ = 'c';
     *oit++ = '=';
     *oit++ = ch;
     *oit++ = '\n';
     iit++;
   }

或者:

void readTo(std::istream_iterator<char> iit, 
        std::string& replaced)
{
    while(iit != std::istream_iterator<char>()) {
        char ch = *iit++;
        if(ch != '$')
           replaced.push_back(ch);
        else
           break;
    }
}