2016-01-12 1 views
2

Я пытаюсь извлечь числа из строки. Я хотел бы сохранить каждое число в отдельной двойной переменной. В настоящее время я пытаюсь использовать простой строковый поток, подобный этому.C++ Как извлечь числа из строки с обратной косой чертой?

std::string line = "100.2456426246\200.2624362436\300.136213477347"; 
std::stringstream stream(line); 
stream.precision(20); 
double a,b,c; 
stream >> a >> b >> c; 

не только точность неправильно (только печатает 6 цифр), он извлекает только первое число а (100,245), и б и является недействительным. Я подозреваю, что это связано с обратным слэшем, но я не совсем уверен.

Каков наилучший способ прочитать строку, содержащую обратную косую черту между каждым номером и правильную точность хранения целого числа?

+1

Как он мог знать, что вы хотите разделить строку на косые черты? – Drop

+1

Для «всего 6 цифр»: [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Drop

+7

Строка ' "100.2456426246 \ 200.2624362436 \ 300.136213477347" 'не содержит обратных косых черт! Но он содержит некоторые необычные символы, отличные от ASCII. – immibis

ответ

2

Вы можете использовать getline с разделителем для разбиения строки в вектор элементов и atof для извлечения поплавка вдоль этих линий

vector<string> elems; 
stringstream stream(line); 
string item; 
while (getline(stream, item, "\\")) { 
    elems.push_back(item); 
} 
vector<float> val(elems.size()); 
... 
val[i]=atof(elems[i].c_str()) 

Точность здесь больше материи презентации, которую вы можете настроить с помощь setprecision. Например,

#include <iomanip> 
... 
cerr << setprecision(6) << val[i] << endl; 

выдает усечение до шести значащих цифр.

Другое дело, что все цифры до последнего сохраняются. Чтобы убедиться, что все цифры сохранены, просто размер вашего определенного поплавка должен быть достаточно большим, чтобы содержать ваши данные, и atof может потребоваться заменить соответствующим парсером, если поплавок должен быть заменен на double или что-то еще.

+0

Спасибо, что это мне очень помогло! – js0823