我需要编写一个函数,它接受输入迭代器和输出迭代器并读取输入流直到完成(我的第一个想法是输入流迭代器将是一个要读取的文件 - 所以当文件内容完全读取时将完成)然后功能将返回。
在这个简单的实验中,从文本文件中读取的字符只会输出到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;
}
答案 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;
}
}