例如,在解析文本文件时,有时这个文件会包含这样的内容:
keyword a string here
keyword another string
keyword
keyword again a string
请注意,第3行有一个空字符串(无空格或空格)。问题是,当你执行stringstream>> laststring,而stringstream有一个空字符串(null或只是空格)时,它不会覆盖“laststring”,它什么都不做。无论如何都要事先检查这种情况?我不想创建一个临时空字符串,只是为了检查它在stringstream>>之后仍然是空的,似乎很蹩脚。
答案 0 :(得分:16)
答案 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';
}
}
您需要加入iostream
,fstream
,sstream
和string
。
答案 3 :(得分:0)
要检查字符串是否为空,请使用foo.size() == 0
。
用于检查字符串流是否为空fooStream.rdbuf()->in_avail() == 0