gpt4 book ai didi

c++ - 你能防止 istream 或 stringstream 吞掉换行符吗?

转载 作者:行者123 更新时间:2023-11-30 03:08:41 26 4
gpt4 key购买 nike

对于我的家庭作业项目,我必须阅读一本书,然后逐字逐句地解析它,列出每个单词出现的次数以及它所在的相应行。我现在已经完成了这个项目,并希望通过阅读其他人对 STL 的使用来优化我的代码(我们应该在很大程度上依赖 STL 来完成这项任务)。

这与家庭作业本身无关,而是我两次尝试阅读每个单词导致流吃掉我的换行符。没有它们,我无法跟踪我正在阅读的文档中的哪一行,因此不再使用此类解决方案。

尝试一:

string word;
stringstream ss;
ss << document; // Document was read from file and stored in a "string document"
while(ss)
{
ss >> word;
// Work with the word.
// Oops! No newlines anymore! :(
}

尝试二:

ifstream ifs(filename.c_str());
if(ifs.is_open)
{
typedef istream_iterator<string> string_input;
vector<string> words;
copy(string_input(ifs), strin_input(), back_inserter(words));

// Oops! The newlines are gone here too! :(
}

我目前的解决方案并不像我想要的那样漂亮,我想在其中加入更多的 STL 魔法(只是为了学习一些精巧的 STL 技巧并更加适应它)

当前解决方案:

读取文件:

std::ostringstream os;
ss << ifstream(filename.c_str()).rdbuf();
return ss.str();

并按行和词拆分:

size_t oldNewLine = 0;
size_t newLine = document_.find('\n', oldNewLine);
while(newLine != string::npos)
{
string documentLine = document_.substr(oldNewLine, (newLine - oldNewLine));
vector<string> words = Utility::split(documentLine);

// Work with each individual word
// Yay! I can keep track of the line number now! :)

oldNewLine = newLine + 1; // Curse you, off by one error!
newLine = document_.find('\n', oldNewLine);
}

文件的阅读简短、简洁且可读性强,但每一行和每个单词的拆分是乏味的。我希望我可以立即从文件中读取每个单词,保留换行符。必须有一个简短、甜蜜的方法来做到这一点!

那么,怎么做呢?

最佳答案

可以逐行解析单词:

std::string line;
vector<string> words;

while(std::getline(ifs, line))
{
std::stringstream linestream(line);

copy(std::istream_iterator<std::string>(linestream),
std::istream_iterator<std::string>(),
std::back_inserter(words));

++lineCount;
}

关于c++ - 你能防止 istream 或 stringstream 吞掉换行符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com