弄清楚一个单词后面是空格还是换行符

时间:2013-09-20 21:23:27

标签: c++

当前代码:

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();
}
}

代码尝试从文本文件(其名称传递给它)中读取,读取它,找到单词(由空格或换行符分隔),然后找出尾随字符(The提到的空格或换行符)

所以文本文件如:

abc def ghi

jkl mno pqr

应该有abc后跟一个空格,ghi和pqr后跟一个新行(我知道实际上它不会,但我将所有内容分配到一个链表以便以后进行预测,并且我需要知道这是结束了。)

我试图将这个难题想象出来好几个小时而且我在智慧结束时。帮助

3 个答案:

答案 0 :(得分:2)

您首先使用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';
    }
}

一种稍微简单的方法是一次只读取一个单词并打印单词后面的字符是否存在,空格或换行符(或者其他空格字符之一): / p>

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';
}

答案 1 :(得分:1)

嗯,默认情况下getline按换行符分隔,所以这应该就是你所需要的。例如:

std::ifstream infile("text.txt");

for (std::string line; std::getline(infile, line); )
{
    std::istringstream iss(line);
    bool firstword = true;
    for (std::string word; iss >> word; )
    {
        if (!firstword) { std::cout << "SPACE\n"; }
        std::cout << word;
        firstword = false;
    }
    std::cout << "NEWLINE\n";
}

布尔标志的复杂性是因为你的空间比你的单词少一些。

答案 2 :(得分:0)

我编辑了你的代码:

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;
    bool firsttime = true;
    while ( ss >> word ) {
        if (!firsttime)
             cout << "Trail: space" << endl;
        cout << "Word: " << word << endl;
        firsttime = false;
    }
    if (!firsttime)
         cout << "Trail: NEWLINE" << endl;
    else
         cout << "empty line." << endl;
    ss.str( string() );
    ss.clear();
}
}