Datei einlesen und string in float konvertieren
-
Ist das nicht eher ne Mischung aus C und C++...
-
Fellhuhn schrieb:
Also in C ganz einfach:
std::string zeile = "bla:123"; double zahl = 0; for(int i = 0; i < zeile.length(); i++){ if (isdigit(zeile[i])){ zahl = atof(zeile.c_str()+i); break; } }... aber sicher nicht schön.

Das ist weder C, noch gescheites C++, mit anderen Worten: |Mist| (absoluter Mist)
@Thread: Die FAQ sind nicht zum Spass da.
-
Ich habe nie gesagt das es C ist. Jämmerlicher Trollversuch.
-
danke erstmal für die schnellen antworten!
> ich wollt nur schreiben was ich so mache

> nein im ernst mein problem liegt natürlich bei der extraktion und dann konvertierung!@Entwickler
> ich hätt gern den code in c++
> bei den FAQs hab ich auch nicht gelacht bzw. mich nicht gefreut!
> die sind nicht gerade übersichtlich!
> deswegen stelle ich hier eine konkrete Frage für die ich gerne konkrete antworten haben würdealso:
1. Die eingelesenen Zeilen haben unterschiedliche Längen und liegen als >string< vor.
-> kein problem
2. aus den strings möchte ich die werte in floats abspeichern
-> problem: wie erkenne ich die zahl im string und konvertiere ich sie nach floatDankeschön nochmal,
Bill
-
Also in C ganz einfach:
... Nein hast du nie ... du pro!

std::string kennt C nicht. Geschweige denn überhaupt den Namensraum std.const std::string line("foo:10.543"); const std::string::size_type pos(line.find(":")); // nach ':' suchen std::ostringstream ss(pos != std::string::npos ? line.substr(pos + 1) : line); // wenn gefunden, nach ':' Zahl, sonst ganzer String Zahl double value_foo(0.0); // variable die den Wert erhalten soll ss >> value_foo; // streamoperator für floatcpp

-
Steamboat Bill schrieb:
e.g.: zeile = "bla:233,21"
Steht in deiner Datei wirklich ein Komma oder ein Punkt ?
-
(D)Evil schrieb:
Also in C ganz einfach:
... Nein hast du nie ... du pro!

Eben, habe ich nicht. Ich habe nur gesagt das es in C ganz einfach ist und ein Beispiel gebracht, das sich in keinster Weise auf die vorherige Aussage stützt.
Aber hier im Forum ist es ja eh üblich lieber Leute anzukacken als sonst was zu schreiben.
-
ein komma kein punkt!
und ich erhalte zwei fehlermeldungen:
Error 1 error C2079: 'ss' uses undefined class 'std::basic_ostringstream<_Elem,_Traits,_Alloc>' start.cpp 257Error 2 error C2440: 'initializing' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'int' start.cpp 257
-
Darfst auch #include <sstream> nicht vergessen.
-
das fehlte:
#include <sstream>und danke
-
Steamboat Bill schrieb:
ein komma kein punkt!
Machts dann nicht inzwischen "Booom" ...
-
Steamboat Bill schrieb:
Ich möchte aus einer Datei zeilenweise einlesen und Teile der Zeile als float abspeichern.
e.g.: zeile = "bla:233,21"
"bla:" weglassen und "233,21" als float speichern.wobei die zahlen im string unterschiedliche länge haben können("2,33443")
Die Vorgehensweise, die man in C++ normalerweise wählen sollte, besteht darin die Datei NICHT zeilenweise zu lesen, sondern direkt die Zahl einzulesen.
Ich unterstelle mal, dass ein ':' als letztes 'nicht Leerzeichen' vor der eigentlichen Zahl steht. Dann ignoriere zunächst alles bis zum Doppelpunkt und lies dann die float-Variable ein. Da bei Dir ein ',' als Dezimaltrennzeichen verwendet wird, muss Du dem Eingabestream vorher noch 'sagen', dass er die deutsche Darstellung von Fließkommazahlen berücksichtigen soll.
Das ganze sieht dann so aus:
#include <fstream> // ifstream #include <limits> // numeric_limits<> #include <iostream> int main() { using namespace std; ifstream in("input.txt"); in.imbue( locale("german") ); // nimmt ',' als Dezimaltrenner float zahl; if( in.ignore( numeric_limits< streamsize >::max(), ':' ) >> zahl ) { cout << "Zahl: " << zahl << " korrekt gelesen" << endl; } return 0; }Die Lokalität "german" kann je nach verwendeter Entwicklungsumgebung auch anders heißen.
Gruß
Werner