Как проверить, будет ли строка stringstream & gt; string ничего не помещать в строку?

Например, при разборе текстового файла иногда в этом файле есть что-то вроде этого:

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

Обратите внимание, что 3-я строка содержит пустую строку (ничего или пробелы). Дело в том, что когда вы выполняете stringstream >> laststring, а stringstream имеет пустую строку (null или просто пробел), он не будет перезаписывать «laststring» «, это ничего не сделает. В любом случае, чтобы проверить эту ситуацию, прежде чем? Я не хочу создавать временную пустую строку только для того, чтобы проверить, что она по-прежнему пуста после stringstream >>, кажется хромой.

5

Решение

Когда вы не можете читать из потока — его состояние меняется, поэтому при приведении к bool возвращается false:

bool read = (ss >> laststring);

Увидеть пример идеона

15

Другие решения

Вы можете только знать после пытаясь прочитать, было ли что-то или нет. Что вы могли бы сделать, это пропустить пробел и посмотреть, есть ли в следующем месте не пробел:

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

Учитывая, что пустые строки дешевы в создании, я бы не стал и пытаться прочитать строку. Тем не менее, обратите внимание, что чтение из потоков не основано на строках, т. Е. В приведенном выше случае необходимо сначала разбить строки или использовать что-то вроде std::getline() читать вторую часть строки.

1

Вы можете использовать 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,

0
По вопросам рекламы [email protected]