Odczyt liczb

0

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.

4
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;
}
0

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?

1

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));
    }
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1