需要从 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"
结尾,例如:groundhhh
、wallhhh
等
在寻找执行此操作的方法时,我想到了 <fstream>
库中的 getline
函数。问题是 getline(a,b,c)
使用 3 个参数,其中第三个参数是读取直到找到 c
但 c
必须是 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;
}
}
我的老师给我布置了这个作业,我需要从文件中读取单词,然后用它们做一些事情。我的问题是这些词必须以"hhh"
结尾,例如:groundhhh
、wallhhh
等
在寻找执行此操作的方法时,我想到了 <fstream>
库中的 getline
函数。问题是 getline(a,b,c)
使用 3 个参数,其中第三个参数是读取直到找到 c
但 c
必须是 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;
}
}