Ifstream std::out_of_range error



  • Hi Leute, ich versuch schon seit 2 Tagen das zu fixen:
    Ich krieg wenn ich versuche eine zeile zu löschen einen out_of_range error...
    meisten kommt der bei der line getline(fin, line) ich hab schon so viele Foren durchforstet aber ich finde keine Lösung und ich weiß nicht mehr weiter.
    Ich will nur dass er eine Zeile löscht von der Orginaldatei und den rest dann in temp.txt ausgibt.
    Danke schonmal im Voraus:)

                std::cout << "Dateiname: ";
    	std::cin >> deleteline;
    
    	std::ifstream fin;
    	fin.open("saves.txt");
    	std::ofstream temp;
    	temp.open("temp.txt");
    
    	while (getline(fin, fline)) {
    
    
    		fline.replace(fline.find(deleteline), deleteline.length(), "");
    		
    		getline(fin, fline);
    
    		temp << fline << std::endl;
    	}
    
    	temp.close();
    	fin.close();
    
    • **```cpp
      Listenpunkt


  • Du muß die Rückgabe von fline.find(deleteline) überprüfen (falls der Substring nicht vorhanden ist, wird npos, d.h. -1 zurückgegeben => out_of_range exception).
    So würdest du bisher immer alle Zeilen löschen.



  • Was ist überhaupt dein Plan, d.h. warum willst du in fline überhaupt irgendwas ersetzen?
    Außerdem ist innerhalb deiner while-Schleife ein zweites getline fragwürdig - willst du nur jede 2. Zeile bearbeiten? Und was ist am Ende der Datei?

    Also mach es lieber einfach:

    funktion soll_geloescht_werden(zeile) -> boolean:
        return deine_bedingung (hier vermutlich: zeile.find(deleteline) != std::string::npos;)
    
    solange Einlesen aus Datei in Variable "zeile":
        wenn nicht soll_geloescht_werden(zeile):
            schreibe zeile in die neue Datei
    

    Du kannst aus dem "soll_geloescht_werden" natürlich auch ein "soll_behalten_werden" machen und dann in der lese-schreib-Schleife unten das nicht entfernen.



  • @Th69 sagte in Ifstream std::out_of_range error:

    Du muß die Rückgabe von fline.find(deleteline) überprüfen (falls der Substring nicht vorhanden ist, wird npos, d.h. -1 zurückgegeben => out_of_range exception).
    So würdest du bisher immer alle Zeilen löschen.

    Danke das hat mir sehr geholfen und habs gelöst:

                std::cout << "Dateiname: ";
    	std::cin >> deleteline;
    
    	std::ifstream fin;
    	fin.open("saves.txt");
    	std::ofstream temp;
    	temp.open("temp.txt");
    
    	while (getline(fin, fline)) {
    
    		if (fline.find(deleteline) != std::string::npos) {
    			fline.replace(fline.find(deleteline), deleteline.length(), "");
    		}
    		else {
    			temp << fline << std::endl;
    		}
    		
    	}
    
    	temp.close();
    	fin.close();


  • @wob es soll nur eine zeile in einer textdatei löschen



  • Du solltest fline.find(deleteline) aber nur einmalig aufrufen:

    std::size pos = fline.find(deleteline);
    if (pos != std::string::npos)
    	fline.replace(pos, deleteline.length(), "");
    else
    	temp << fline << std::endl;
    

    Aber eigentlich ist der ganze Aufruf von fline.replace(...) überflüssig, denn es reicht ja

    if (fline.find(deleteline) == std::string::npos)
    	temp << fline << std::endl;
    


  • @unkn0wn sagte in Ifstream std::out_of_range error:

    @wob es soll nur eine zeile in einer textdatei löschen

    Das hatte ich verstanden. Ich wollte wissen: warum replace? Wenn du eine Zeile mit dem Inhalt "C++ ist tolll" hast und dein deleteline-String "ist" enthält, dann löscht du erst ist heraus und ignorierst die Zeile danach komplett. Das erscheint nicht sinnvoll.

    Daher die Frage, was du eigentlich erreichen willst. Soll nur der Suchstring entfernt werden oder die gesame Zeile, in der er vorkommt?


Anmelden zum Antworten