Stringstream to Int64_t
-
Hallo an alle!
Ich habe eine Frage: Ich möchte einen gegebenen Stringstream in ein int64_t convertieren.
Ansich geht das ja ganz einfach:stringstream ss; int64_t nummer = 0; ss >> nummer;Bisher habe ich das immer so gemacht und das hat auch funktioniert, aber jetzt mekkert er rum:
int main(int argc, char *argv[]) { ifstream file; char zeile[1024]; std::string str = "meinedatei.txt"; char * filename = new char[str.size() + 1]; std::copy(str.begin(), str.end(), filename); filename[str.size()] = '\0'; int zaehler = 0; string s; stringstream ss; int64_t nummer = 0; int64_t zeitSub = 0; int64_t zeit_Pub = 0; int64_t nummern = 0; file.open(filename, ios::in);// Datei öffnen if (file.good())// Wenn die Datei geoeffnet werden konnte { file.seekg(0L, ios::beg); // An den Anfang der Datei springen while (! file.eof()){ // Die Datei zeilenweise auslesen file.getline(zeile, 1024); cout << zeile << endl; zaehler = 0 ; while(zeile[zaehler] != ';'){ if(zeile[zaehler] != ':' && zeile[zaehler] != ','){ s += zeile[zaehler]; cout << "Aktueller String: " << s << endl; }else{ ss.str(s); cout << "Stringstream: " << ss.str() << endl; if(nummer !=0 && zeitSub != 0) { cout << "Fall 3!" <<endl; ss >> zeit_Pub; cout << "Pub Zeit: " << zeit_Pub << endl;} if(nummer !=0 && zeitSub == 0) { cout << "Fall 2!" <<endl; ss >> zeitSub; cout << "Sub Zeit: " << zeitSub << endl;} if(nummer == 0) { cout << "Fall 1!" <<endl; ss >> nummer; cout << ss.str()<< endl; ss >> nummern; cout << "Nummer: " << nummer <<"sss" << nummern << endl;} s = ""; ss << ""; } zaehler++; }//while(zeile[zaehler] != ';') /* cout << "Stringstream: " << ss.str() << endl; cout << "Nummer: " << nummer << endl; cout << "Sub Zeit: " << zeit_Sub << endl; cout << "Pub Zeit: " << zeit_Pub << endl;*/ }//while (! file.eof()) } else // Wenn die Datei nicht geoeffnet werden konnte { cout << "Datei nicht gefunden." << endl; } return 0; }Die Ausgabe sieht wie folgt aus:
122:1322947545256,1322947545244; <--- das steht in der .txt
Aktueller String: 1
Aktueller String: 12
Aktueller String: 122
Stringstream: 122
Fall 1!
122
Nummer: 122sss0Die Frage die ich habe: wieso macht er den cast ss >> nummer korrekt, aber 2 codezeilen später ss >> nummern nichtmehr ???
Ich hab mir den stringstream wie ihr sehr zwischendurch auch ausgebenlassen um zu sehn ob er vllt. gelehrt wird, dem ist aber nicht so.
Kann mir da jemand helfen ?Viele Grüße
Alfred
-
Erstmal vorneweg: das ist keine Konvertierung die der stringstream tut. Er ließt einfach nur eine Zahl ein. Wenn, dann "konvertierung eines strings"
Aber zurück:
Was soll da noch kommen? in "s" steht nur "122" drin und die hast du in "nummer" eingelesen. Du kannst nichts mehr weiter über den stringstream einlesen, da du bereits am Ende des Strigns angelangt bist. Du musst wohl erstmal mehr einlesen...
-
Ah ok, d.h. wenn ich quasi "nummer" eingelesen habe und dann "nummern" einlesen möchte (da sollte testweise quasi am ende das gleiche drinstehn wie bei nummer) muss ich ihm erst sagen das er wieder an den anfang des stringstreams gehen muss?
Ok das sollte erstma Info genug sein, damit bekom ich es sicher hin!
Danke
-
Vielleicht noch etwas weniger gefummel mir ohen Arrays:
#include <iostream> #include <fstream> #include <sstream> #include <string> #include <algorithm> struct replacer { replacer(std::string const & to_replace) : m_to_replace(to_replace){} bool operator()(char c) const{ return std::find(m_to_replace.begin(), m_to_replace.end(), c) != m_to_replace.end(); } std::string m_to_replace; }; int main(int argc, char *argv[]) { int64_t nummer = 0; int64_t zeitSub = 0; int64_t zeit_Pub = 0; int64_t nummern = 0; std::string str = "meinedatei.txt"; //oder gleich direkt im stream angeben... ifstream reader(str.c_str()); std::string line; while(std::getline(reader, line)) { std::cout << "Current line: " << line << std::endl; //alle trennzeichen durch leerzeichen austauschen std::replace_if(line.begin(), line.end(), replacer(",:;"), ' '); std::istringstream isstr(line); int64_t current = 0; while(isstr >> current) { if(nummer == 0) { nummer == current; isstr >> nummern; } else { if(zeitSub == 0) { zeitSub = current; } else { zeit_Pub = current; } } } std::cout << "Parse line result: \n" << " nummer : " << nummer << '\n' << " nummern : " << nummern << '\n' << " zeitSub : " << zeitSub << '\n' << " zeit_Pub : " << zeit_Pub << std::endl; } }Außerdem: Bist Du Dir sicher, dass die Logik, nach der nummer, zeitSub und zeit_Pub zugewiesen werden so richtig ist?