Textdatei zeilenweise auslesen und in neue schreiben



  • hi Folks!!!

    ich muss in c++ ein programm schreiben das die zeilen in einer textdatei ausliest und zwar nach folgendem schema:
    11111111;222222222;3333333;4444444;.........
    also in jeder zeile steht halt irgendwas und es kommt immer mal wieder ein ;
    das programm soll jetzt nach jedem 5. ; eine neue zeile beginnen und das in die neue datei schreiben

    also so das in der neuen datei immer nur 5 ; drinne stehen und in der 2ten wieder usw...

    wäre für hilfe sehr dankbar
    flip125@gmx.de



  • Folgendes Programm liest allerdings zeichenweise ein.
    Sonst müsstest du die eingelesene Zeile in einen string lesen und diesen dann nach dem 5. ";" zerlegen.

    #include <iostream.h>
    
    int main()
    {
       char buff;
       int count=0;
       FILE *falt=fopen("Alte.txt","r"),*fneu=fopen("Neue.txt","w");;
       while(!feof(falt))
       {
          buff=fgetc(falt);
          if(buff!='\n'&&!feof(falt))fputc(buff,fneu);
          if(buff==';') count++;
          if(count==5)
          {
             fputc('\n',fneu);
             count=0;
          }
       }
       fclose(falt);
       fclose(fneu);
       return 0;
    }
    


  • Hallo!

    @_Stefan:
    Dein Code ist zwar korrekt, bildet aber leider nur eine Lösung in Standard C ab. 🙄

    Die Lösung in Standard C++ (ist hier in dieser Rubrik doch gewünscht, oder? ;)) lautet:

    #include <iostream>                                     // 1
    #include <fstream>                                      // 2
    #include <string>                                       // 3
    
    using namespace std;
    
    int main()
    {
      fstream in_file("original.txt", ios::in);             // 4
      fstream out_file("kopie.txt", ios::out | ios::trunc); // 5
    
      string buffer;
    
    	while(!in_file.eof())                             // 6
    	{
    		getline(in_file, buffer, ' ');              // 7
    		out_file << buffer << endl;                 // 8
    	}
    
    	return 0;
    }
    
    /*
    1 - Inkludiert für "endl", kann auch rausgeschmissen werden, wenn "endl" durch "\n"
        ersetzt wird.
    2 - Stellt uns die nötigen Klassen zur Dateibehandlung zur Verfügung.
    3 - Inkludiert für die Funktion getline() zum Zeilenweisen lesen
    4 - Erstellt Objekt "in_file" der Klasse "fstream".
        1. Parameter ist der Dateiname (evtl. inklusive Pfadangabe),
    		2. Parameter gibt die Optionen an, in diesem Fall "Einlesen".
    5 - Erstellt Objekt "out_file" der Klasse "fstream".
        1. Parameter ist der Dateiname (evtl. inklusive Pfadangabe),
    		2. Parameter gibt die Optionen an, in diesem Fall "Ausgabe" und "Neu Schreiben".
    6 - Solange ausführen wie die Methode "eof()" des Objektes "in_file" NICHT true zurückgibt.
        (eof = End of File)
    7 - Zeile aus "in_file" in unseren "buffer" schreiben. Der dritte Parameter ist Compiler
        abhängig. Der Visual C++ 6.0 - Compiler verlangt in (weswegen auch immer),
    		der Borland C++ 5.5 - Compiler kann auf ihn verzichten. Einfach mal probieren.
    8 - Zeile im Buffer in die Ausgabedatei "out_file" schreiben. Dahinter muss noch ein
        ein Zeilenumbruch (falls gewünscht) angegeben werden.
    */
    

    Hoffe ich konnte helfen... 🙂



  • Mein Code ist zwar in C.
    Dafür erfüllt er aber seine Aufgabe.
    Dein Code würde eine 1:1 Kopie der Ursprungsdatei erstellen.



  • Stimmt, mir ging es auch nur um Datei Ein- und Ausgabe.
    Sorry, wenn ich mich falsch ausgedrückt hab'.



  • Jetzt aber die wirkliche Lösung zu der Aufgabe(, wenn ich sie diesmal richtig verstanden hab...):

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
      fstream in_file("original.txt", ios::in);
      fstream out_file("kopie.txt", ios::out | ios::trunc);
    
      char buffer;
      int  count = 0;
      while(in_file >> buffer)
      {
        if(!in_file.eof())
        {
          if(buffer == ';') count++;
          out_file << buffer;
          if(count == 5)
          {
            out_file << endl;
            count = 0;
          }
        }
      }
      return 0;
    }
    

    Geht wahrscheinlich auch noch einfacher...



  • #include <fstream>
    using namespace std;
    
    int main() {
      ifstream in("original.txt");
      ofstream out("kopie.txt");
    
      unsigned count = 0;
      char ch;
    
      while (in.get(ch)) {
        if (ch == ';') ++count;
        out.put(ch);
        if (count == 5) {
          out.put('\n');
          count = 0;
        }
      }
    }
    

    sollte kürzer und korrekter sein (wie immer ohne gewehr)


Anmelden zum Antworten