txt dati mit Trennzeichen auslesen
-
Hallo
Ich hoffe dass ich hier eine schnelle Lösung findeIch habe eine *.txt Datei mit zum Beispiel folgendem Inhalt
1;cy1;r1;sw
2;cy2;r2;sw
3;cy3;r3;sw
4;cy4;r4;swmit folgendem Script möchte ich die Datei auslesen und in eine zweite Datei schreiben
#include <fstream> #include <iostream> #include <string> using namespace std; int main() { char zeile [500]; // Zeile max 121 Zeichen string wert[1000]; // Datei Max 10000 Zeilen ifstream dateiLese ("var.txt"); // Eingabe Datei ofstream dateiSchreibe ("output.txt"); // Ausgabe Datei if (dateiLese) { dateiSchreibe << "<?xml version=\"1.0\" standalone=\"no\"?>"<< endl; dateiSchreibe << "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">"<< endl; dateiSchreibe << "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n\n"<< endl; int i=0; // solange die Zeile nicht leer ist while(dateiLese.getline (zeile, 500)) { // Zeile lesen wert[i]=zeile; // Hier kann die Zeile bearbeitet werden // Zeile in ausgabe.txt schreiben dateiSchreibe << "<circle cx=\""<<wert[i]<<"\" cy=\""<<cy1<<"\" r=\""<<r1<<"\" stroke=\"black\" stroke-width=\""<<sw<<"\" fill=\"black\" />"<< endl; i++; } dateiLese.close (); // Datei schliessen dateiSchreibe << "</svg> "<< endl; dateiSchreibe.close(); // Datei schliessen } }
es funktioniert auch fast
Einen einzelnen Wert kann ich eintragen wenn z.B. in der *.txt Datei nur
1
2
3
4
steht so wird dies bei wert[i] eingetragen. *Um jetzt mal auf den Punkt zu kommen, hat vielleicht jemand eine Ahnung wie ich die anderen stellen cy1 r1 und sw ebenfalls aus der .txt entnehmen kann??
vielen Dank schon mal für alle Hilfen
lg
tobias
-
Zeig kompletten Code; dein Beispiel kompiliert noch nicht einmal.
-
Servus.
Meine Idee:
Alle Semikolons durch Leerzeichen ersetzen (das wurde hier beschrieben: http://stackoverflow.com/questions/2896600/how-to-replace-all-occurrences-of-a-character-in-string), und anschließend kannst du das in einen Stringstream werfen und mit dem operator<< nacheinander auslesen. Wenn du es alleine nicht hinbekommst melde dich einfach, dann programmier ich dir das fix. Ansonsten betrachte es als Übungsaufgabe ;).Grüße
Max
-
Jetzt hat mich das Problem so interessiert, dass ich es doch fix mal ausprobiert habe.
Hier ist meine Lösung:#include <iostream> #include <sstream> #include <string> using namespace std; int main() { string satz("Das;ist;ein;Test;"); int pos=0; while((pos=satz.find(";",pos)) < satz.length()) satz.replace(pos, 1, " "); cout << "Satz: " << satz << endl; istringstream ss(satz); int ctr=0; char buf[255]; while(!ss.eof()) { ss >> buf; cout << "Wort " << ++ctr << ": " << buf << endl; } }
Ein kleiner Fehler ist aber noch drin.
Die Ausgabe ist:Das ist ein Test Word 1: Das Word 2: ist Word 3: ein Word 4: Test Word 5: Test
Wo das fünfte Wort herkommt hab ich noch nicht ganz gecheckt.
Edit: Das Semikolon am Satzende ist das Problem. Da es bei dir aber nicht so formatiert ist sollte es kein Problem darstellen.
-
Hier mal eine C++ Lösung:
#include <fstream> #include <iostream> #include <iterator> #include <string> #include <vector> using namespace std; struct record { string number; string cy; string r; string sw; }; istream& operator>>( istream& in, record& rec ) { const char separator = ';'; getline( in, rec.number, separator ); getline( in, rec.cy, separator ); getline( in, rec.r, separator ); getline( in, rec.sw ); return in; } int main() { ifstream file_input("var.txt"); vector<record> records; for( record rec; file_input>>rec; records.push_back(rec) ); ofstream file_output("output.txt"); file_output << "<?xml version=\"1.0\" standalone=\"no\"?>" << '\n'; file_output << "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">" << '\n'; file_output << "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n\n" << '\n'; for( vector<record>::iterator it=records.begin(); it!=records.end(); ++it) { file_output << "<circle cx=\"" << it->number << "\" cy=\"" << it->cy << "\" r=\"" << it->r << "\" stroke=\"black\" stroke-width=\"" << it->sw <<"\" fill=\"black\" />" << '\n'; } file_output << "</svg> "<< '\n'; }
-
oder so:
std::ifstream stream("yowassupPunktTxt"); std::string string; while(stream.good()){ getline(stream, string, ';'); std::cout << "Bitteschön: " << string << '\n'; }
-
Max3000 schrieb:
Wo das fünfte Wort herkommt hab ich noch nicht ganz gecheckt.
Das ist weil du falsch von der Datei ließt. Du machst folgendes:
1. Prüfen
2. Lesen
3. Verarbeiten
Das ist natürlich Murx .Du musst es natürlich so machen :
1. Lesen
2. Prüfen
3. Verarbeiten, falls erfolgreich gelesen.