C : получение отдельных значений с плавающей запятой из строковой строки с плавающей запятой

#c #string #parsing #floating-point

#c #строка #синтаксический анализ #с плавающей запятой

Вопрос:

Предположим, у нас есть строковая строка:

14.6527 39.5652 -344.226 -3.34672

Давайте назовем эту строку, str_line .

Мой вопрос в том, как мы можем разобрать это в массив с плавающей запятой, float data[4] .

Я пытался использовать getline из stringstream, но безрезультатно (см. Ниже Представление моего кода). Любая помощь будет оценена по достоинству 🙂

 for(int i=0;i<4;i  ){
  stringstream ss(str_line);
  ss.getline( str_line, 8, ' ' );
  data[i]=atof(ss);
}
  

Комментарии:

1. Для чего это? Если это часть более крупного синтаксического анализатора, вы можете использовать boost spirit qi; в этом случае ваша проблема решаема с помощью однострочной строки.

2. У меня есть текстовый файл с множеством значений с плавающей запятой (каждая строка содержит 21 значение с плавающей запятой), и я хочу поместить каждое значение с плавающей запятой в массив для последующей обработки.

Ответ №1:

Вы должны объявить stringstream объект ss один раз, не делайте это в цикле.

Затем вам нужно использовать оператор только >> для извлечения значений с плавающей запятой из потока.

 stringstream ss(str_line);
for(int i=0;i<4;i  ){
  ss >> data[i];
}
  

Если вы читаете из файла, вы можете использовать файловый поток, подобный ifstream файловому потоку, и читать значения с плавающей запятой непосредственно из него. Поток будет игнорировать любые пробелы, включая новые строки.

Комментарии:

1. Вы также должны проверить состояние после цикла (и, возможно, убедиться, что в нем больше не осталось данных ss ).

2. @JamesKanze Я думаю, было бы лучше, если бы OP использовался ifstream напрямую, реализовал соответствующий код обработки ошибок и т.д. OP может прочитать руководство по обработке потоков, чтобы понять это правильно. Этот простой вопрос касался извлечения 4 значений с плавающей запятой из строки, которая, как известно, их содержит, поэтому ответ также ограничен.

Ответ №2:

Используйте >> оператор на stringstream :

 ss >> data[i];