Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从流中丢弃。ignore()不适用于此目的,还有其他方法吗?_C++_Ifstream_Ignore - Fatal编程技术网

C++ 如何从流中丢弃。ignore()不适用于此目的,还有其他方法吗?

C++ 如何从流中丢弃。ignore()不适用于此目的,还有其他方法吗?,c++,ifstream,ignore,C++,Ifstream,Ignore,我对溪流缺乏了解。其思想是,将文件读入ifstream,然后使用它。将数据从流提取到字符串,并从流中丢弃现在位于字符串中的部分。可能吗?或者如何处理这些问题 以下方法用于插入ifstream正确读取的文件。(它是一个文本文件,包含关于“丢失”剧集的信息,它是一个情节指南。对于类剧集的一个元素,它工作得很好。每次我实例化一个剧集文件时,我都想检查该文件的流,丢弃关于一个剧集的信息(由“*****”表示,然后下一个剧集开始)并处理字符串中丢弃的信息。如果我创建了一个新的插曲对象,我希望在“*****

我对溪流缺乏了解。其思想是,将文件读入ifstream,然后使用它。将数据从流提取到字符串,并从流中丢弃现在位于字符串中的部分。可能吗?或者如何处理这些问题

以下方法用于插入ifstream正确读取的文件。(它是一个文本文件,包含关于“丢失”剧集的信息,它是一个情节指南。对于类剧集的一个元素,它工作得很好。每次我实例化一个剧集文件时,我都想检查该文件的流,丢弃关于一个剧集的信息(由“*****”表示,然后下一个剧集开始)并处理字符串中丢弃的信息。如果我创建了一个新的插曲对象,我希望在“*****”之后到下一个“*****”之后丢弃关于插曲的下一个信息,依此类推

void Episode::read(ifstream& in) {
    string contents((istreambuf_iterator<char>(in)), istreambuf_iterator<char>());
    size_t episodeEndPos = contents.find("****");
    if ( episodeEndPos == -1) {
        in.ignore(numeric_limits<char>::max());
        in.clear(), in.sync();
        fullContent = contents;
    }
    else { // empty stream for next episode
        in.ignore(episodeEndPos + 4);
        fullContent = contents.substr(0, episodeEndPos);
    }
    // fill attributes 
    setNrHelper();
    setTitelHelper();
    setFlashbackHelper();
    setDescriptionHelper();
}
void插曲::读取(ifstream&in){
字符串内容((istreambuf_迭代器(in)),istreambuf_迭代器();
size\u t episodeEndPos=内容。查找(*****);
if(epiodeEndPos==-1){
in.ignore(数值限制::max());
in.clear()、in.sync();
fullContent=内容;
}
else{//下一集的流为空
in.忽略(epiodeEndpos+4);
fullContent=contents.substr(0,epiodeEndPos);
}
//填充属性
setnrheloper();
setTitelHelper();
setFlashbackHelper();
setDescriptionHelper();
}

我用infle>>words(阅读单词,这是一种从流中提取单词的方法)尝试了它。我考虑的另一种方法是使用。ignore(忽略流中的大量字符)。但这没有达到预期效果。对不起,我的英语不好,希望我想做的事情很清楚。

如果你的目标是每次调用
Read()
阅读下一集并在文件中前进,那么诀窍就是使用并将位置添加到书签并更新:

void Episode::Read(ifstream& in) {
    streampos pos = in.tellg();   // backup current position
    string fullContent;
    string contents((istreambuf_iterator<char>(in)), istreambuf_iterator<char>());
    size_t episodeEndPos = contents.find("****");
    if (episodeEndPos == -1) {
        in.ignore(numeric_limits<char>::max());
        in.clear(), in.sync();
        fullContent = contents;
    }
    else { // empty stream for next episode  
        fullContent = contents.substr(0, episodeEndPos);
        in.seekg(pos + streamoff(episodeEndPos + 4)); // position file at next episode
    }
}

您得到的代码一次读取整个流,只是为了使用读取文本的某一部分初始化对象。想象一个巨大的文件,这几乎肯定是个坏主意。更简单的方法是只读取,直到找到结束标记。在理想的世界中,结束标记很容易找到。根据注释,它似乎位于它的一行上这将使它变得非常容易:

void Episode::read(std::istream& in) {
    std::string text;
    for (std::string line; in >> line && line != "****"; ) {
        text += line + "\n";
    }
    fullContent = text;
}
如果separate不在自己的行上,则可以使用如下代码:

void Episode::read(std::istream& in) {
    std::string text;
    for (std::istreambuf_iterator<char> it(in), end; it != end; ++it) {
        text.push_back(*it);
        if (*it == '*' && 4u <= text.size() && text.substr(text.size() - 4) == "****") {
            break;
    }
    if (4u <= text.size() && text.substr(text.size() - 4u) == "****") {
        text.resize(text.size() - 4u);
    }
    fullContent = text;
}
void插曲::read(std::istream&in){
std::字符串文本;
对于(std::istreambuf_迭代器it(in),end;it!=end;++it){
text.push_back(*它);

如果(*它=='*'&&4u测试
string::npos
而不是
-1
,因为
size\u t
是无符号的。您在声明
内容时使用流迭代器将流发送到EOF状态。请返回到流的开头,或者将代码更改为在流内容的一个过程中运行T.Christophe你说得对,我错了,但这不是问题所在。0x499602D2啊,我明白了,这是对的…流处于eof状态。该文件是什么样子的?它可以工作。我如何给你评分。谢谢你的快速回答!它是一个格式化的txt文件。我有一个带有属性“标题”“描述”“闪回”“情节编号”的课堂插曲依此类推。我在字符串中搜索,并在该字符串上查找和处理。我如何向您显示文件?不想复制和粘贴,它是一个大文件。它看起来像。LOST:Inhalt der ersten Staffel(Quelle:www.LOST-fans.de)第1.01集GESTRANDET,TEIL 1(PILOT)Jacks Auge o FffNETSICH…***N 1.02集N下一个TyLeOK!VistStine!所以每集有几个文本行,“***”可以在一条直线的中间(即不是孤立在一条线上).对吗?它是孤立在一行上的,你是说用getline逐行阅读更好吗?它都是由行分隔的,我指的是重要的行,比如它是哪一集,它的标题是什么。然后逐行阅读将是最简单的方法。见编辑谢谢你,你帮了我很多。如果我没有看到这种方法,那么我将uld在这件事上花了很多时间。谢谢你。我感谢你的帮助!
void Episode::read(std::istream& in) {
    std::string text;
    for (std::istreambuf_iterator<char> it(in), end; it != end; ++it) {
        text.push_back(*it);
        if (*it == '*' && 4u <= text.size() && text.substr(text.size() - 4) == "****") {
            break;
    }
    if (4u <= text.size() && text.substr(text.size() - 4u) == "****") {
        text.resize(text.size() - 4u);
    }
    fullContent = text;
}