如何通过输入迭代器进行迭代

How to iterate through input iterator

本文关键字:迭代 迭代器 何通过 输入      更新时间:2023-10-16

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

在这个简单的实验中,从文本文件中读取的

字符将直接输出到标准输出。

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

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;
}

我算出来了。它有点抽象,所以花了我一些时间。

std标准库的迭代器以范围的形式作用于迭代器。为了灵活起见,您可以传入整个容器,如:vec.begin()、vec.end()或某些子集。但是如果是输入迭代器该怎么办呢?什么是结束。你创建了一个没有初始化的迭代器

ie

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;
    }
}