fstream - getline Problem



  • Also wenn ich dass richtig verstanden habe, kann man mit geline nur aus einer Datei AUSLESEN...und nicht in eine Datei etwas REINSCHREIBEN?
    Somit:
    getline(Objekt wo eine Zeile rausgelesen wird, Hier wird die rausgelesene Zeile dann gespeichert)

    Richtig?

    Weil ich hab gedacht mit getline kann man auch etwas Zeilenweise in eine Datei reinschreiben.

    MfG
    Stromberg



  • Stromberg schrieb:

    Also wenn ich dass richtig verstanden habe, kann man mit geline nur aus einer Datei AUSLESEN...und nicht in eine Datei etwas REINSCHREIBEN?

    Was impliziert den der Name "getline" anderes? ;p

    Stromberg schrieb:

    Weil ich hab gedacht mit getline kann man auch etwas Zeilenweise in eine Datei reinschreiben.

    Nein, hier kannst du aber einfach Streamoperationen nehmen...

    m_file << line << std::endl;
    

    cu André



  • Wie mach ich das denn mit getline wenn ich nur zb. die zweite Zeile eines txt-Dokuments auslesen will?
    also

    char engvok[200];
    char gervok[200];
    ifstream InFile;
        InFile.open(pszDATEI);
            if (!InFile)
        {
            cout << "Fehler beim Oeffnen der Datei!\n";
            exit(1);
        }
    
        InFile >> engvok >> gervok;
    
            InFile.close();
    

    Der getline-Befehl muss ja anscheinend dem InFile >>... folgen, da dieser ja die erste Zeile ausliest. Wie muss denn dann der getline-Befehl für die zweite zeile lauten?



  • Ruf doch einfach zweimal getline auf. Dann hast du auch zwei Zeilen eingelesen. Die erste Zeile kannst du dann selber auseinander nehmen.



  • Hmm , irgendwie bekomm ich das net hin. Wie sage kann ich mir denn mit getline nur Zeile 3, zum Beispiel, auslesen lassen?
    Hab bisher gut erklärte Lösung gefunden.



  • Wenn du bereits eine gut erklärte Lösung gefunden hast ist es ja ok. 🙂
    Du kannst nicht nur die dritte Zeile einlesen. Du musst immer bis zur dritten Zeile einlesen (also 3mal getline).



  • Upps 😃
    Dann versuch ich das mal. Ich hoffe, ich hab keine Problem dabei.
    Danke für die schnelle Antwort.



  • Hmm, ich habs zwar jetzt hinbekommen, dass mir verschieden Zeilen ausgelesen werden. Nur ist das bei einem txt-Dokument mit einer hohen Zeilenanzahl, sehr mühselig, für jede Zeile eine neue Variable zu definieren und auszulesen:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    char engvok[256];
    char gervok[256];
    const char* const pszDATEI = "vok_db.txt";
    int main() {
                string a,b,c,...           
    
        ifstream InFile;
    
        InFile.open(pszDATEI);
            if (!InFile)
        {
            cout << "Fehler beim Oeffnen der Datei!\n";
            exit(1);
        }
    
        getline(InFile, a);
        getline(InFile, b);
        getline(InFile, c);
    ...
    
            InFile.close();
    
    cout<<a<<"\n"<<b<<"\n"<<c<<"\n"...;
    system("Pause");
    }
    

    Gibt es da keine einfachere und elegantere Lösung als diese?



  • Wie wäres es mit einer Schlaufe + Array/std::vector?



  • Und wie würde das denn dann aussehen? Weil ich hab ehrlich gesagt keine Ahnung, wie ich das mit dem Array machen soll...
    Mit der Schleife, das ist das kleinere Problem, denke ich.



  • Ein Array von strings?

    std::string vokabels[1000]; // 1000 Vokabeln
    std::vector<std::string> vokabels2; // Dynamisches Array
    

    Du kannst dann ja ganz einfach auf die strings zugreifen.

    for (int i = 0; i < 1000; i++)
        getline (InFile,vokabels[i]);
    

    So was in der Art.



  • Super! Danke 🙂
    Auch gut, dass du das kommentiert hast. Jetzt gehts glaub ich auch wieder voran mit dem Programm.



  • Mit dem vector klappt das aber irgendwie nicht ganz, Der gibt mir den Fehler aus, dass vector nicht in dem Namensraum von std liegt...
    Muss ich da noch etwas oben hinschreiben? Weil eigentlich verwende ich ja

    using namespace std
    

    Edit: Habs jetzt, weiß was falsch war.



  • Na toll, hab schon wieder ein Problem, bei dem ich keine Lösung weiß...
    Diesmal kommt folgende Fehlermeldung:
    no match for 'operator<<' in 'std::cout << vokabels2'
    Jedoch weiß ich nicht, was an folgendem Script falsch sein soll:

    std::string vokabels[1000];
    std::vector<std::string> vokabels2; 
    for (int i = 0; i < 1000; i++)   {                
        getline (InFile,vokabels[i]);                 
    
    }               
            InFile.close();                     
       system("cls");               
        cout <<vokabels2<<"\n";
    

    Sieht vielleicht irgendjemand den Fehler bei meinem Script?



  • Ich sehe da mehr als einen Fehler.
    1. Du liest in vokabels ein willst aber vokabels2 ausgeben, welches gar nicht gefüllt ist. Was genau willst du eigentlich?
    2.

    cout <<vokabels2<<"\n";
    

    Es existiert kein Ausgabeoperator für vector<string>. Das kannst du aber schön in einer Schleife machen (gibt noch mehr Möglichkeiten).
    also

    std::vector<std::string> vokabels2;
    std::string tstr;
    for (int i = 0; i < 1000; i++)   {                
        getline (InFile,tstr);     // in temporäre variable einlesen            
        vokabels2.push_back(tstr); // in den vector kopieren                                          
    }              
    InFile.close();   // nicht zwingend nötig                 
    system("cls");
    size_t size = vokabels2.size(); //Größe des vectors feststellen
    for( size_t i=0; i<size; ++i)             
        cout << vokabels2[i] <<"\n"; // einzelne Elemente ausgeben
    


  • Danke für die Lösung. Man lernt ja bekanntlich immer dazu, und ich merke, dass das bei mir noch sehr viel ist, was ich zu lernen habe 😉 .



  • Also so langsam frage ich mich, ob ich nicht einen einfachen Taschenrechner als Projekt(Schule) abgeben soll...
    Irgendwie ist bei mir der Wurm drin. Mein neuestes Problem ist, dass die Zeilen zwar ausgelesen werden, aber direkt danach wieder verschwinden. D.h. ich seh für einen ganz kurzen Moment meine Liste, bevor sie wieder verschwindet...
    Kann es daran legen, dass alles nur temporär gespeichert wird, und direkt danach wieder überschrieben bzw. gelöscht wird? Wenn ja, wie kann ich denn dann die Daten festhalten?
    Hier mal das \1:

    #include <iostream>
    #include <fstream>
    #include <vector>
    
    using namespace std; 
    char engvok[200]; 
    char gervok[200];
    const char* const pszDATEI = "vok_db.txt"; 
    int main() {
        system("cls"); 
        ifstream InFile;       
        InFile.open(pszDATEI); 
            if (!InFile)       
        {
            cout << "Fehler beim Oeffnen der Datei!\n"; 
            exit(1);                                    
        }    
    std::vector<std::string> vokabels2; // Dynamisches Array 
    std::string tstr;                                  
    for (int i = 0; i < 1000; i++)   {           
        getline (InFile,tstr);                         // in temporäre variable einlesen 
        vokabels2.push_back(tstr);                     // in den vector kopieren   
    }               
           InFile.close();                            
           system("cls");
       size_t size = vokabels2.size();                 // Größe des Vektors 
       for(size_t i=0; i<size; ++i) 
           cout <<vokabels2[i]<<"\n";                  
    
       system("Pause");                                
    }
    


  • Ich sehe da kein Fehler, ausser, dass du <string> inkludieren und das ganez NICHT Script nennen solltest. 😉
    Sag dem Programm, Quellcode, Code oder so, aber bitte nicht SCRIPT..



  • Danke für die Belehrung ;).
    Nur komm ich leider nun einfach nicht weiter mit meinem Programm. Gibt es vielleicht sonst noch etwas einfaches konsolenbasiertes zu programmieren auf der Schwierigkeitsebene eines Taschenrechners ungefähr?
    Weil ich habe einfach zu viele Probleme mit dem Vokabelprogramm...
    Oder hat nicht einer zufällig noch ein Vokabelprogramm "herumliegen", welches Vokabeln aus einer txt-Datei nimmt, die komplette txt-Datei ausliest, wo man Vokabeln hinzufügen kann, und wo man halt abgefragt wird???



  • Chrisl schrieb:

    Danke für die Belehrung ;).
    Nur komm ich leider nun einfach nicht weiter mit meinem Programm. Gibt es vielleicht sonst noch etwas einfaches konsolenbasiertes zu programmieren auf der Schwierigkeitsebene eines Taschenrechners ungefähr?
    Weil ich habe einfach zu viele Probleme mit dem Vokabelprogramm...
    Oder hat nicht einer zufällig noch ein Vokabelprogramm "herumliegen", welches Vokabeln aus einer txt-Datei nimmt, die komplette txt-Datei ausliest, wo man Vokabeln hinzufügen kann, und wo man halt abgefragt wird???

    Bitte, bitte. Und da kommt schon die nächste. NICHT AUFGEBEN, wenn schwieriger wird oder du gerade nicht weiterkommst. Du wirst umso mehr voller Stolz sein, wenn du das hinkriegst.
    Also so schwer sollte das jetzt ja nicht sein. Am besten fängst du einfach nochmal an und überlegst dir, was dein Programm alles können soll und dann, wie du das am besten umsetzt und dann fängst du an zu programmieren.
    Falls du dir nicht sicher bist, wie du das umsetzen kannst, spiel einfach ein wenig mit den IO Klassen rum und schau ein wenig, wie sich die verhalten. Und wenn du das Gefühl hast es verstanden zu haben, machst du dich wieder an die Aufgabe.

    Wenn du in etwa so vorgehst, wie oben beschrieben, solltest du die Aufgabe hinkriegen. Wenn du konkrete Fragen hast, kannst du natürlich fragen, aber einfach die Aufgabe für dich lösen werden die meisten nicht. Du sollst ja noch was lernen und da kommst du nicht drum herum dich intensiv mit dem Problem zu beschäftigen. 😉


Anmelden zum Antworten