Witam,
problem polega na tym, że mam z pliku wczytać wartości:
woda 1.7e-3
powietrze 1.6e-5
użytkownik wybiera ośrodek woda/powietrze po czym do zmiennej chce przypisać wartość 1.7e-3/1.6e-5. I tu jest problem(pobierając kolejno linie aż !eof), chciałbym przekonwertować string/char na double z zachowaniem postaci ...e-x, ewentualnie juz gotowej 0.0017/0,000016.
Nie mam kompletnie pomysłu. Proszę o pomoc.
double input(std::istream &is) {
try {
std::string input;
is >> input;
size_t e_position = input.find('e');
string first_s, second_s;
first_s = input.substr(0, e_position);
second_s = input.substr(e_position + 1);
double first, second;
first = std::stod(first_s);
second = std::stod(second_s);
return first * std::pow(10., second);
} catch(...) { throw std::invalid_argument("Invalid input"); }
}
Lepsza propozycja od @kq:
double input(std::istream &is) {
is >> result;
return result;
}
Dziękuję za odpowiedź. Mam pewien problem, gdy podsyłam do funkcji string li="124e-4"; wywala błąd "invalid initialization of reference of type 'std::istream& {aka std::basic_istream<char>&}' from expression of type 'std::string {aka std::basic_string<char>}' " Podsyłam zły typ danych? próbowałem char * też nie rusza.
Moja idea wgl jak to ma działać:
Kolejne linie z pliku wprowadzam do vectora typu string, który przechowuje mi "woda 1.6e-4". Następnie chcę poszukać spacji i spacja+1 wyciąć 1.6e-4 do zmiennej string, którą dalej chcę przekonwertować, dlatego też chcę podesłać do funkcji tego stringa.
Jeszcze jedno pytanie, czy jeśli dane w pliku są zapisane w formacie kolumnowym, czyli 1 kolumna "ośrodek" kolejne wiersze to nazwy, 2 kolumna "współczynnik oporu" kolejne wiersze to wartości , to czy muszę tutaj używać tablic dwuwymiarowych?
Jeszcze jedno pytanie, czy jeśli dane w pliku są zapisane w formacie kolumnowym, czyli 1 kolumna "ośrodek" kolejne wiersze to nazwy, 2 kolumna "współczynnik oporu" kolejne wiersze to wartości , to czy muszę tutaj używać tablic dwuwymiarowych?
Zrobiłbym z tego std::map<std::string, int>
(lub multimapę jeśli klucze będą się powtarzać).
Jeśli w pliku dane rozdzielone są spacją, wczytuj dane operatorem wejścia >>, lub std::getline()
z terminatorem spacją (od razu będą rozdzielone dane).
#include <map>
#include <iostream>
#include <fstream>
#include <string>
auto main() ->int
{
std::map<std::string, int> msi;
std::string dataName;
int value;
std::ifstream file("test.txt");
while (file >> dataName >> value)
{
msi.insert(std::make_pair(dataName, value));
}
}