使用迭代器将文件的一部分复制到另一部分 我仍然练习C++,我在FielestRAMs上遇到了char迭代器。

使用迭代器将文件的一部分复制到另一部分 我仍然练习C++,我在FielestRAMs上遇到了char迭代器。,c++,iterator,filestream,C++,Iterator,Filestream,我想将文件的一部分复制到另一个(临时)文件。我想在第一个文件中找到一个特定的字符串(我使用了std::find算法),以便知道在哪里可以“剪切”要复制的文件部分(希望有意义)。我的问题是,对于下面的代码,我有一个编译错误,我并不真正理解 我所讨论的代码部分如下所示: ifstream readStream(fileName.c_str()); istreambuf_iterator<char> fStart(readStream); istreambuf_iterator<ch

我想将文件的一部分复制到另一个(临时)文件。我想在第一个文件中找到一个特定的字符串(我使用了std::find算法),以便知道在哪里可以“剪切”要复制的文件部分(希望有意义)。我的问题是,对于下面的代码,我有一个编译错误,我并不真正理解

我所讨论的代码部分如下所示:

ifstream readStream(fileName.c_str());
istreambuf_iterator<char> fStart(readStream);
istreambuf_iterator<char> fEnd;
auto position = find(fStart, fEnd, refToReplace); // refToReplace is a std::string
if (position != fEnd){ // If the reference appears in the file
    ofstream tempStream("temp.fsr"); // create the temp file
    copy(fStart, position , ostreambuf_iterator<char>(fluxTemp)); // and copy the part I want (before the matching string)
}
else{
            continue;
}
ifstream readStream(fileName.c_str());
istreambuf_迭代器fStart(readStream);
istreambuf_迭代器fEnd;
自动位置=查找(fStart、fEnd、refToReplace);//refToReplace是一个std::字符串
if(position!=fEnd){//如果引用出现在文件中
ofstream tempStream(“temp.fsr”);//创建临时文件
复制(fStart,position,ostreambuf_迭代器(fluxTemp));//并复制我想要的部分(在匹配字符串之前)
}
否则{
继续;
}
我在“stl_algo.h”中遇到的编译错误是:

错误:在'\uu first.std::istreambuf\u迭代器::operator*()==\uu val'中没有与'operator='匹配的项

提前谢谢。

编译错误应该附带一个实例化回溯,告诉您是哪个调用最终导致了错误

在您的情况下,这将指向
find
调用
find
查找单个元素,迭代器的元素类型为单个字符,但传递字符串。(根据您的描述。您的代码片段实际上没有告诉我们
refstorereplace
的类型。)

您正在寻找的算法是
search
,但它需要前向迭代器,而streambuf迭代器则不需要


您需要选择不同的方法。

流不是容器。它们是数据流……可能是您将position作为auto to copy()传递,而auto to copy()需要显式类型?@KLibby我之前在使用explixit类型定义position时遇到了相同的错误。我试图把它改成自动,希望这就是我出错的原因,但它没有改变任何事情^^在构建消息中,我在std::find调用的行中得到一个警告“required from here”,我想这就是您所指的。我使用std::find算法是因为它与==运算符一起工作,所以我认为它可以与字符串一起工作,但您所说的完全有道理。^^但最后,有没有一种方法可以使用迭代器搜索文件中的子字符串,或者我必须完全更改我的代码片段?没有简单的方法。有一些适配器可以将流迭代器转换为正向迭代器(Boost.Spirit包括一个);这对那些会有用的,好吧。最后,我将第一个文件的内容复制到一个字符串中(使用strinsgstream,idk,如果这是最好的方法,但效果很好),而不是一个临时文件,因此我可以对该字符串使用算法。我想避免这种方法,因为我的文件的内容相当长,但它并没有那么糟糕,而且我可以很好地工作。非常感谢你的帮助!
error: no match for 'operator==' in '__first.std::istreambuf_iterator<_CharT, _Traits>::operator*<char, std::char_traits<char> >() == __val'