需要从 archive.txt 中读取一行文本直到找到 "hhh" 然后转到下一行

Need to read a line of text from an archive.txt until "hhh" its found and then go to the next line

我的老师给我布置了这个作业,我需要从文件中读取单词,然后用它们做一些事情。我的问题是这些词必须以"hhh"结尾,例如:groundhhhwallhhh

在寻找执行此操作的方法时,我想到了 <fstream> 库中的 getline 函数。问题是 getline(a,b,c) 使用 3 个参数,其中第三个参数是读取直到找到 cc 必须是 char,所以它不起作用对我来说。

本质上,我想要实现的是从文件中读取一个单词,例如 "egghhh",如果读取 "hhh" 则意味着该行在那里结束我收到 "egg" 这个词。我的老师用 "sentinel" 这个词来描述这个 hhh 东西。

这是我的尝试:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

ifstream read_archive;

void showListWords(){

    string word;

    string sentinel = "hhh";

    while (getline(read_archive,word,sentinel)){

        cout << word << endl;
    }
}

void openReadArchive(){

    read_archive.open("words.txt");

    if(read_archive.fail())

        cout << "There is something wrong with the archive" << endl;

}

如您所见,std::getline() 只允许您为停止阅读的 "sentinel" 指定 1 char,其中 '\n'(换行符)是默认。

您可以做的是使用此默认值从文件中读取整行文本到 std::string,然后将该字符串放入 std::istringstream 并从该流中读取单词,直到到达流的末尾或者您找到以 "hhh" 结尾的单词,例如:

#include <sstream>
#include <limits>

void showListWords()
{
    string line, word;
    string sentinel = "hhh";

    while (getline(read_archive, line))
    {
        istringstream iss(line);
        while (iss >> word)
        {
            if (word.length() > sentinel.length())
            {
                string::size_type index = word.length() - sentinel.length();
                if (word.compare(index, sentinel.length(), sentinel) == 0)
                {
                    word.resize(index);
                    iss.ignore(numeric_limits<streamsize>::max());
                }
            }

            cout << word << endl;
        }
    }
}

在这种情况下,您也可以只从原始文件流中读取单词,当您找到以 "hhh" 结尾的单词时停止,然后继续阅读当前行的其余部分 ignore()从下一行读出单词,例如:

#include <limits>

void showListWords()
{
    string word;
    string sentinel = "hhh";

    while (read_archive >> word)
    {
        if (word.length() > sentinel.length())
        {
            string::size_type index = word.length() - sentinel.length();
            if (word.compare(index, sentinel.length(), sentinel) == 0)
            {
                word.resize(index);
                read_archive.ignore(numeric_limits<streamsize>:max, '\n');
            }
        }

        cout << word << endl;
    }
}