0

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

在这个简单的实验中,从文本文件读取的字符将简单地输出到标准输出。

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

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

1 回答 1

1

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

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;
    }
}
于 2013-06-07T18:30:29.453 回答