如何检查stringstream>>字符串是否会在字符串上放什么?

时间:2012-10-16 22:04:08

标签: c++ string stringstream

例如,在解析文本文件时,有时这个文件会包含这样的内容:

keyword a string here
keyword another string
keyword 
keyword again a string

请注意,第3行有一个空字符串(无空格或空格)。问题是,当你执行stringstream>> laststring,而stringstream有一个空字符串(null或只是空格)时,它不会覆盖“laststring”,它什么都不做。无论如何都要事先检查这种情况?我不想创建一个临时空字符串,只是为了检查它在stringstream>>之后仍然是空的,似乎很蹩脚。

4 个答案:

答案 0 :(得分:16)

当您无法从流中读取时 - 其状态会发生变化,因此当转换为bool时将返回false:

bool read = (ss >> laststring);

请参阅ideone example

答案 1 :(得分:1)

您只能在之后知道尝试读取是否有某些内容。您可以做的是跳过空格,看看下一个位置是否有非空格:

if ((in >> std::ws).peek() != std::char_traits<char>::eof()) {
    ...
}

鉴于空字符串创建起来很便宜,我不会打扰并尝试读取字符串。但请注意,从流中读取不是基于行的,即,在上面的情况下,您需要先拆分行,或使用std::getline()之类的内容来读取行的第二部分。

答案 2 :(得分:0)

您可以使用getline从文件中读取一行。然后,将该行复制到字符串流中,并一次一个地从字符串流中读取单词。当流线/单词用完时,流将自动停止读取。

// open file
std::ifstream fin("text.txt");

// 'iterate' through all the lines in the file
unsigned lineCount = 1;
std::string line;
while (std::getline(fin, line))
{
    // print the line number for debugging
    std::cout << "Line " << lineCount << '\n';

    // copy line into another stream
    std::stringstream lineStream(line);

    // 'iterate' through all the words in the line
    unsigned wordCount = 1;
    std::string word;
    while (lineStream >> word)
    {
        // print the words for debugging
        std::cout << '\t' << wordCount++ << ' ' << word << '\n';
    }
}

您需要加入iostreamfstreamsstreamstring

答案 3 :(得分:0)

要检查字符串是否为空,请使用foo.size() == 0

用于检查字符串流是否为空fooStream.rdbuf()->in_avail() == 0