Мне нужно использовать C++ для чтения текста с пробелами, за которым следует числовое значение.
Например, данные, которые выглядят так:
text1
1.0
text two
2.1
text2 again
3.1
не может быть прочитан с помощью 2 операторов "infile >>". Мне не везет с getline
либо. В конечном итоге я хочу заполнить struct этими двумя элементами данных. Есть идеи?





Если вы можете быть уверены, что ваш ввод правильно сформирован, вы можете попробовать что-то вроде этого примера:
#include <iostream>
#include <sstream>
int main()
{
std::istringstream iss("text1 1.0 text two 2.1 text2 again 3.1");
for ( ;; )
{
double x;
if ( iss >> x )
{
std::cout << x << std::endl;
}
else
{
iss.clear();
std::string junk;
if ( !(iss >> junk) )
break;
}
}
}
Если вам действительно нужно проверять ввод (вместо того, чтобы просто пытаться разобрать что-то похожее на его двойник), вам придется написать какой-то парсер, что несложно, но скучно.
Да, оператор потока >> пропускает пробелы (физическая мысль.blogspot.com/2008/06/…).
Да, он пропускает пробелы, но автора интересовали только числа. То, что я написал здесь, - это просто «быстрый и грязный» способ разбора всех чисел, разделенных пробелами, из потока.
Почему? Вы можете использовать getline, предоставляя пробел в качестве разделителя строк. Затем сшейте извлеченные части, если рядом стоит номер.
Стандартная библиотека ввода-вывода не собирается делать это за вас одного, вам нужен какой-то простой анализ данных, чтобы определить, где заканчивается текст и начинается числовое значение. Если вы можете сделать некоторые упрощающие предположения (например, сказать, что есть ровно одна пара текст / число на строку и минимальное восстановление ошибок), было бы неплохо, если бы getline () все это превратилось в строку, а затем просканировало ее вручную. В противном случае вам, вероятно, лучше использовать регулярное выражение или библиотеку синтаксического анализа, чтобы справиться с этим, чем изобретать колесо.
Псевдокод.
Это должно сработать. Однако предполагается, что у вас есть пара текста / чисел. Вам также придется немного потрудиться, чтобы все печатали довольными.
while( ! eof)
getline(textbuffer)
getline(numberbuffer)
stringlist = tokenize(textbuffer)
number = atof(numberbuffer)
Возможно, я неправильно помню семантику оператора std :: string >>, но разве это не помогает собрать пробелы в текстовом поле?