Anfänger braucht Hilfe :)



  • Hi,
    ich habe mir eine Konsolen-Anwendung gebastelt. Nur bin ich jetzt an einem punkt wo ich nicht weiter weiss. Mein Problem ist das ich den Fehler nicht finde.

    Ich habe mit Hilfe von fstream eine Datei erstellen und reinschreiben lassen.
    Ich möchte diese gespeicherten Daten an einem anderen punkt anzeigen lassen, aber anstatt der Daten kommt nix. Hier der Code in dem ich den Fehler vermute.

    --------------------------------------------------------------------------

    case 1:
    			cout << "Zum beenden 1 angeben"<< endl;
    
    			_chdir("Daten");
    			d.open("Deutsch", ios::out);
    			e.open("English", ios::out);
    
    			cin.clear(); 
    			cin.ignore(std::cin.rdbuf()->in_avail());
    
    			while (!d.eof())
    			{
    				d.getline(wortd, sizeof(wortd));
    				e.getline(worte, sizeof(worte));
    
    				wdh:;
    
    				cout << wortd <<": "<<endl;
    				cin >> af;
    
    				if(af == "1")
    				{
    					goto anfang;
    				}
    				if(af != worte)
    				{
    					goto wdh;
    				}
    
    			}
    			d.close();
    			e.close();
    			cout << "Training abgeschlossen" <<endl;
    			goto anfang;
    		break;
    

    Ich hoffe jemand kann mir helfen.



  • Du öffnest die Dateien mit dem Modus "ios::out" - das ist zum Schreiben vorgesehen und löscht den Inhalt der Datei. Zum Lesen von Daten benötigst du "ios::in".

    PS: Und ich wette mit dir, daß gleich Pi vorbeikommt und dich auf RAII hinweist 😃



  • Danke 🙂
    aber.... wie könnt ich denn das verwechseln??? 🙄



  • Ganz tollo goto s



  • d.open("Deutsch", ios::out);
    			e.open("English", ios::out);
    

    Du hättest dein Problem von Anfang an nicht, wenn du direkt den richtigen Filestream verwendet hättest.

    std::ifstream d("Deutsch");
    			std::ifstream e("English");
    

    Nennt sich RAII. Mit RAII ist auch folgendes unnötig:

    d.close();
    			e.close();
    
    cin.ignore(std::cin.rdbuf()->in_avail());
    

    Tut nicht, was du willst. Was du willst, ist:

    std::cin.ignore(std::numeric_limits<std::steamsize>::max());
    
    while (!d.eof())
    

    Ist eine falsche Bedingung. Richtig wäre:

    while(std::getline(d, wortd) && std::getline(e, worte))
    

    Deine ganzen gotos und Sprungmarken sind Käse, dafür gibts Schleifen und Funktionen.



  • 314159265358979 schrieb:

    Nennt sich RAII.

    CStoll schrieb:

    PS: Und ich wette mit dir, daß gleich Pi vorbeikommt und dich auf RAII hinweist 😃

    Respekt, auf dich ist verlass! 🤡



  • otze schrieb:

    Respekt, auf dich ist verlass! 🤡

    Muss ja, kann den armen CStoll doch nicht ewig warten lassen 😉



  • 314159265358979 schrieb:

    Was du willst, ist:

    std::cin.ignore(std::numeric_limits<std::steamsize>::max());
    

    Nicht ganz, denn die Zeile ignoriert alles, was jemals noch aus cin gekommen wäre (oder zumindest die nächsten... ähh.. 4 GiB).

    Eine Abbruchbedingung wäre gut. Die zweite Überladung von ignore ignoriert Zeichen bis entweder die übergebene Anzahl erreicht oder ein Delimiter gelesen wurde:

    std::cin.ignore(std::numeric_limits<std::steamsize>::max(), '\n');
    


  • Da hast du natürlich Recht, Schande über mein Haupt 🤡



  • Falls TE meckert, dass

    std::cin.ignore(std::numeric_limits<std::steamsize>::max(), '\n');
    

    nicht funktioniert hier der Hotfix:

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    


  • 😃 👍



  • DocShoe schrieb:

    Hotfix:

    Verdammtes Coy & Pate...



  • Danke für eure Hilfe;)
    aber eine frage hätte ich noch, da ich es noch nciht weiss:
    Gibt es ne möglichkteit bei

    d.getline(wortd, sizeof(wortd))
    

    Eine zufällige Zeile auszulesen?

    Schonmal danke im vorraus;)

    Nimiz


  • Mod

    Nimiz schrieb:

    Danke für eure Hilfe;)
    aber eine frage hätte ich noch, da ich es noch nciht weiss:
    Gibt es ne möglichkteit bei

    d.getline(wortd, sizeof(wortd))
    

    Eine zufällige Zeile auszulesen?

    Schonmal danke im v******;)

    Nimiz

    Erst einmal: Nimm keine char-Arrays, nimm std::string und das dazugehörige getline. Du wirst dankbar sein.

    Und zweitens: Nein. Zumindest gibt es keine magische Funktion get_random_line . Da musst du selber anfangen zu zauber und sie dir selber schreiben. Empfohlene Vorgehensweise: Alle Zeilen einlesen und speichern (std::vector). Bei Bedarf nach einer zufälligen Zeile eine zufällige Zeile aus dem vector nehmen (neuer Header random, oder falls noch nicht vorhanden rand aus cstdlib).



  • Nimiz schrieb:

    Schonmal danke im v******;)

    Um die naechste Frage vorwegzunehmen:

    voraus


Anmelden zum Antworten