dat_aus.open(dateiname.c_str(), ios_base::out); löscht Dateiinhalt



  • Hallo,

    ich möchte zu Testzwecken ein Programm schreiben, das in Textdokumenten die Buchstabenkombination "Studie" findet und durch "frei" ersetzt. Dazu habe ich bisher folgenden Quelltext verfasst:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main() 
    {
      ifstream dat_ein;
      ofstream dat_aus;
      string dateiname;
      int bedingung = 1;
      char zeichen, ersetzen;
    
      cout << "Geben Sie den Pfad und Namen der Datei ein: ";  
      cin  >> dateiname;                                     
      cout << endl;
    
      dat_ein.open(dateiname.c_str(), ios_base::in);
    
      if(!dat_ein)                              
       {
       cout << "Datei konnte nicht geoeffnet werden!";
       cout << endl;
       return -1;
       }
    
    :arrow_right: dat_aus.open(dateiname.c_str(), ios_base::out);
    
      if(!dat_aus)                              
       {
       cout << "Datei konnte nicht geoeffnet werden!";
       cout << endl;
       return -1;
       }
    
      while (bedingung == 1)
      {
      while (!dat_ein.eof())        
        {
        dat_ein.get(zeichen);
    
    	if(zeichen == 'S')
        {
    	  cout << "Gut!" << endl;
    
    	  ersetzen = 'f';
    	  dat_aus << ersetzen;
    
    	  dat_ein.get(zeichen);
    	  if(zeichen == 't')
    	  {
    		  cout << "Gut!" << endl;
    		  ersetzen = 'r';
    		  dat_aus << ersetzen;
    
    		  dat_ein.get(zeichen);
    		  if(zeichen == 'u')
    		  {
    			  cout << "Gut!" << endl;
    			  ersetzen = 'e';
    			  dat_aus << ersetzen;
    
    			  dat_ein.get(zeichen);
    			  if(zeichen == 'd')
    			  {
    				  cout << "Gut!" << endl;
    				  ersetzen = 'i';
    				  dat_aus << ersetzen;
    
    				  dat_ein.get(zeichen);
    				  if(zeichen == 'i')
    				  {
    					  cout << "Gut!" << endl;
    					  ersetzen = ' ';
    				      dat_aus << ersetzen;
    
    					  dat_ein.get(zeichen);
    					  if(zeichen == 'e')
    					  {
    						  cout << "Gut!" << endl;
    						  ersetzen = ' ';
    						  dat_aus << ersetzen;
    					  }
    
    					  else
    					  {
    						  bedingung = 1;
    						  break;
    					  }
    
    				  }
    
    				  else
    					  {
    						  bedingung = 1;
    						  break;
    					  }
    			  }
    
    			  else
    					  {
    						  bedingung = 1;
    						  break;
    					  }
    		  }
    
    		  else
    					  {
    						  bedingung = 1;
    						  break;
    					  }
    	   }
    
    	  else
    					  {
    						  bedingung = 1;
    						  break;
    					  }
    	}
    
    	}
    
      break;
      }
    
      dat_aus.close();
      dat_ein.close();
    
       return 0;
    }
    

    Er wird anstandslos kompiliert doch die Testdatei, in der nur das Wort "Studie" stehen sollte ist nach Ausführung der Anweisung

    dat_aus.open(dateiname.c_str(), ios_base::out);

    leer und dementsprechend wird auch der String "Gut!" nicht ausgegeben. Warum wird die Datei durch diese Anweisung geleert?

    Anstelle der if-Verzweigungen müsste man einen besseren Algorhythmus finden, der bestimmte Buchstabenkombinationen finden kann. Kann mir jemand helfen? Bin leider noch nicht sonderlich erfahren mit C++...

    Thx für Rettungsversuche,

    die Killermilchschnitte



  • Hallo,
    Das liegt an ios_base::out, welches Die Datei beim öffnen auf 0 setzt. Was du machst, ist eine Datei zum lesen zu öffnen, (der Dateiinhalt bleibt hierbei noch erhalten), danach jedoch die gleiche Datei zum schreiben zu öffnen => Der Dateiinhalt wird gelöscht... (Btw.: Ich würde nicht mit zwei Streams auf eine Datei gleichzeitig arbeiten...)

    /edit: Bzg. den vielen Ifs: Schau dir doch mal Schleifen und Arrays an :).

    Gruß Caipi



  • Hi caipi,

    Das liegt an ios_base::out, welches Die Datei beim öffnen auf 0 setzt. Was du machst, ist eine Datei zum lesen zu öffnen, (der Dateiinhalt bleibt hierbei noch erhalten), danach jedoch die gleiche Datei zum schreiben zu öffnen => Der Dateiinhalt wird gelöscht... (Btw.: Ich würde nicht mit zwei Streams auf eine Datei gleichzeitig arbeiten...)

    Wie kann ich denn stattdessen in eine Datei schreiben, ohne sie zu nullen?

    Bzg. den vielen Ifs: Schau dir doch mal Schleifen und Arrays an .

    Ne, das versteh ich jetzt nicht... 🙂



  • killermilchschnitte schrieb:

    Hi caipi,

    Das liegt an ios_base::out, welches Die Datei beim öffnen auf 0 setzt. Was du machst, ist eine Datei zum lesen zu öffnen, (der Dateiinhalt bleibt hierbei noch erhalten), danach jedoch die gleiche Datei zum schreiben zu öffnen => Der Dateiinhalt wird gelöscht... (Btw.: Ich würde nicht mit zwei Streams auf eine Datei gleichzeitig arbeiten...)

    Wie kann ich denn stattdessen in eine Datei schreiben, ohne sie zu nullen?

    Entweder nacheinander mit den streams auf die Datei arbeiten, eine fstream mit der Datei assoziieren (d.h. einen Stream, mit dem du sowohl lesend als auch schreibend auf selbige zugreifen kannst), ..., Design umdenken. Du siehst, es gibt viele Wege :).

    Persönlich würde ich dir empfehlen das Design zu überdenken. Glaub mir, da liegt der Hase im Pfeffer :).

    Gruß Caipi



  • Nimm eine zweite Datei für die Ausgabe 😉

    @ifs: Du kannst auch versuchen, die Datei zeilenweise in einen std::string einzulesen - dann kannst du mit string-eigenen Methoden suchen und ersetzen.

    (ohne Anspruch auf Korrektheit)

    dat_ein.getline(s);
    while((i=s.find("Studie"))!=string::npos)
      s=s.substring(0,i)+"frei"+s.substring(i+6 /*<- Länge von "Studie");
    dat_aus << s;
    


  • Hallo,

    also jetzt verstehe ich nichts mehr. Ich glaub es würde mir erstmal reichen, wenn mir jemand erklären könnte, wie aus mehreren char-Zeichen einen String bauen kann, den man dann manipuliert.

    Das mit den beiden Streams hab ich auch nicht verstanden, mein Lehrbuch hat dazu kein Kapitel gehabt (easy C++ von M+T). Wie kann ich in eine Datei schreiben, ohne "dat_aus.open(dateiname.c_str(), ios_base::out);" zu schreiben und damit die Datei zu nullen?

    Danke für eure Hilfe,

    Killermilchschnitte



  • @Strings: an einen bestehenden string kannst du mit str+=c oder str.append(c) weitere Zeichen anhängen.

    @Streams: Erstens solltest du für Ein- und Ausgabe verschiedene Dateien* nehmen, sonst kommst du mit dir selbst ins Gehege - und das kann nicht gesund sein. Und zweitens versuch' mal "dat_aus.open(dateiname.c_str(), ios_base::append);" (damit wird die Datei geöffnet und neue Daten hinter dem bisherigen Inhalt angehängt).

    * Damit sind nicht verschiedene Streams gemeint, sondern die Dateien auf der Festplatte:

    dat_ein.open(dateiname.c_str(),iosbase::in);
    dateiname.insert(dateiname.rfind('.')-1,"neu"); // hängt ein "neu" vor der Dateiendung an
    dat_aus.open(dateiname.c_str(),iosbase::append);
    

Anmelden zum Antworten