string problematik?
-
Guten Abend Gemeinde,
int readFromFile() { cout << "Enter filename: "; cin>> fileName; ifstream input(fileName.c_str(),ios::in); if (input.is_open()) { while (getline(input, fileName)) { istringstream istr (fileName); // "A ; 1; 1" if (istr >>Standort && istr >> c && c == ';' && istr >> cordx && istr >> c && c == ';' && istr >> cordy) { //map.addDest(Standort,cordx,cordy); cout <<fileName <<endl; } } } else { cout << "Datei nicht gefunden!" << endl; readFromFile(); } cin.get(); cin.sync(); return 0; }tsp.csv
A ; 1; 1 B ; 7; 7 C ; 14; 5 D ; 3; 4 SehrWeitWeg; 4711; 1147und zwar frisst er den string Standort nicht ohne Whitespace.
sprich:SehrWeitWeg; 4711; 1147 ---> geht nicht! SehrWeitWeg ; 4711; 1147 ---> geht!bei den Zahlen ist es komischerweise egal..
PS: hat jemand eine schönere Variante für den else-Teil:
cout << "Datei nicht gefunden!" << endl; [b]readFromFile();[/b]gruß!!
-
Ich würde gleich mal eine etwas allgemeinere Funktion dafür schreiben. Aus php bin ich rechter Fan von explode, also:
#include <vector> #include <string> #include <algorithm> std::vector<std::string> explode ( std::string input, char del, bool trim = true ) { std::vector<std::string> v; std::istringstream s( input ); std::string temp; while ( std::getline ( s, temp, del ) ) { if ( trim ) temp.erase ( std::remove ( temp.begin (), temp.end (), ' '), temp.end () ); v.push_back ( temp ); } return v; } int main() { std::string line = "SehrWeitWeg; 4711; 1147 "; std::vector<std::string> params = explode ( line, ';' ); for (std::vector<std::string>::iterator it = params.begin (); it != params.end (); ++it ) std::cout << *it << " "; }Das macht aus einer Zeile genau das erwartete. Nämlich eine Liste von Werten. Die sind halt noch in string Form, aber ich denke, dass du die Umwandlung in den gewünschten Datentypen noch selbt hinkriegst.
Für den else Part würde ich eine Schleife empfehlen. Kannst ja einen Parameter
successfuloder so haben, den du erst, wenn es geklappt hat auf true setzt und dann läuft das einfach so lange, bis es gelungen ist.
-
ok, danke hat sich erledigt!

-
pampy schrieb:
ok, danke hat sich erledigt!

s
Hast du es mit dem obigen Code gemacht, oder komplett anderst?
Wenn du es anderst gelöst hast, dann wäre es schön, wenn du die Lösung auch gleich postest.
Es gibt nix nervigeres, als wenn man auf der Suche nach der Lösung eines Problemes ist und man einen Thread findet, der genau das gleiche Problem hat und dann findet er eine Lösung, postet sie aber nicht.

-
so wie in deinem Post, ganz klar :p
-
http://www.gamedev.net/community/forums/topic.asp?topic_id=381544#TokenizeString
#include <iostream> #include <string> #include <vector> std::vector<std::string> TokenizeString(const std::string& str, const std::string& delim) { using namespace std; vector<string> tokens; size_t p0 = 0, p1 = string::npos; while(p0 != string::npos) { p1 = str.find_first_of(delim, p0); if(p1 != p0) { string token = str.substr(p0, p1 - p0); tokens.push_back(token); } p0 = str.find_first_not_of(delim, p1); } return tokens; } int main(int argc, char* argv[]) { std::string source = "This string will be tokenized by a vector of characters which are vowels"; std::vector<std::string> tokens = TokenizeString(source, "aeiou"); std::cout << source << std::endl; for(int x = 0; x < tokens.size(); x++) { std::cout << tokens[x] << std::endl; } std::cout << std::endl; source = "This.string.will; be tokenized, with spaces and :puncutation!"; tokens = TokenizeString(source, ",. :;!"); std::cout << source << std::endl; for(int x = 0; x < tokens.size(); x++) { std::cout << tokens[x] << std::endl; } return 0; }