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