当前代码:
void LinkedList::readFunct( string file ) {
string word;
string trailing_char;
stringstream ss;
ifstream infile ( file.c_str() );
while ( getline( infile, word)) {
cout << "The line is " << word << endl;
ss << word;
while ( getline ( ss, word, ' ' )) {
trailing_char = "space";
cout << "Word: " << word << endl << "Trail: "<< trailing_char << endl;
}
ss.str( string() );
ss.clear();
}
}
代码尝试从文本文件中提取名称(将其传递给文本文件),通读它,找到单词(用空格或换行符分隔),然后找出结尾字符(提到的空格或新队)
所以像这样的文本文件:
abc def ghi
jkl mno pqr
应该在abc后面加上一个空格,在ghi和pqr后面加上新行(我知道实际上不会,但是我将所有内容分配给一个链表以便以后进行混淆处理,但我需要知道那是结束了线)。
我试图弄清楚这个谜题已经花了好几个小时,而我却无能为力。救命?
最佳答案
您首先使用std::getline(in, word)
读取字符串,这将耗尽所有换行符。然后,当您使用std::getline(in, word, ' ')
时,最后一个单词可能紧随其后,即位于行边界。检查换行符与空格之间的差异的方法是检查内部std::getline()
是由于空格而停止还是因为它到达字符串的末尾而停止,在这种情况下它实际上已停止,因为以下字符是换行符:
while (std::getline( infile, word)) {
std::cout << "The line is '" << word << "'\n";
ss.clear();
ss.str(word);
while (std::getline (ss, word, ' ' )) {
trailing_char = ss.eof()? "newline": "space";
cout << "Word: " << word << endl << "Trail: "<< trailing_char << '\n';
}
}
一种更简单的方法是一次只读取一个单词的文件,然后打印是否出现单词后的字符,空格或换行符(或与此有关的其他空白字符之一):
for (std::string word; infile >> word; ) {
switch (infile.peek()) {
case '\n': trail = "newline"; break;
case '\r': trail = "carriage-return"; break;
case ' ': trail = "space"; break;
case '\f\: trail = "form-feed"; break;
// ...?
default: trail = "end-of-file"; break;
}
std::cout << "word='" << word << "' trail=" << trail << '\n';
}
关于c++ - 找出单词后面是否有空格或换行符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18926097/