Например, при разборе текстового файла иногда в этом файле есть что-то вроде этого:
keyword a string here
keyword another string
keyword
keyword again a string
Обратите внимание, что 3-я строка содержит пустую строку (ничего или пробелы). Дело в том, что когда вы выполняете stringstream >> laststring, а stringstream имеет пустую строку (null или просто пробел), он не будет перезаписывать «laststring» «, это ничего не сделает. В любом случае, чтобы проверить эту ситуацию, прежде чем? Я не хочу создавать временную пустую строку только для того, чтобы проверить, что она по-прежнему пуста после stringstream >>, кажется хромой.
Когда вы не можете читать из потока — его состояние меняется, поэтому при приведении к bool возвращается false:
bool read = (ss >> laststring);
Увидеть пример идеона
Вы можете только знать после пытаясь прочитать, было ли что-то или нет. Что вы могли бы сделать, это пропустить пробел и посмотреть, есть ли в следующем месте не пробел:
if ((in >> std::ws).peek() != std::char_traits<char>::eof()) {
...
}
Учитывая, что пустые строки дешевы в создании, я бы не стал и пытаться прочитать строку. Тем не менее, обратите внимание, что чтение из потоков не основано на строках, т. Е. В приведенном выше случае необходимо сначала разбить строки или использовать что-то вроде std::getline()
читать вторую часть строки.
Вы можете использовать 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
,