当前代码:

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/

10-11 22:43
查看更多