txt dati mit Trennzeichen auslesen



  • Hallo
    Ich hoffe dass ich hier eine schnelle Lösung finde

    Ich habe eine *.txt Datei mit zum Beispiel folgendem Inhalt
    1;cy1;r1;sw
    2;cy2;r2;sw
    3;cy3;r3;sw
    4;cy4;r4;sw

    mit 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.


Log in to reply