Probleme mit globales getline()



  • Hallo,

    bei mir funktioniert die getline Funktion nicht richtig!

    Irgendwie ist beim ausgeben der Strom kaputt.

    http://www.bilder-hochladen.net/files/fjnx-1.jpg

    links (kaputt) hab ich den Code verwendet
    cout << vWords.at(i).getDeutsch() << "-" << vWords.at(i).getEnglisch() << endl;

    und rechts
    cout << vWords.at(i).getDeutsch() << "#" << endl; // geht
    cout << vWords.at(i).getEnglisch() << endl;

    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include "Word.h"
    
    void Datenlesen(vector<Word> &);
    
    int main(int argc, char** argv) {
        vector<Word> vWords;
    
        Datenlesen(vWords);
        for (int i = 0; i < vWords.size(); i++) {
            cout << i << ". ";
    //        cout << vWords.at(i).getDeutsch() << "-" << vWords.at(i).getEnglisch() << endl; // geht nicht
                            cout << vWords.at(i).getDeutsch() << "#" << endl; // geht
                            cout << vWords.at(i).getEnglisch() << endl;
        }
    
        return (EXIT_SUCCESS);
    }
    
    void Datenlesen(vector<Word> & vWords) {
        ifstream inClientFile("Words.txt", ios::in);
        if (!inClientFile) {
            cerr << "File could not be opened" << endl;
            exit(1);
        } else {
            string Zeile, Englisch, Deutsch;
            int PositionKomma;
            while (!inClientFile.eof()) {
                getline(inClientFile, Zeile);
                //    inClientFile >> Zeile; // geht leider nicht da auch leerzeichen vorhanden sind
                PositionKomma = Zeile.find(",");
                Englisch = Zeile.substr(0, PositionKomma);
                Deutsch = Zeile.substr(PositionKomma + 1, string::npos);
                Word wort;
                wort.setEnglisch(Englisch);
                wort.setDeutsch(Deutsch);
                vWords.push_back(wort);
            }
            inClientFile.close();
        }
    }
    

    Die Textdatei

    In Zeile 34 macht die getline() irgendwas kaputt..
    mit inClientFile >> Zeile geht es zwar auch, jedoch ist es dann nicht so toll wenn leerzeichen in einer Zeile sind.

    Ich würde jedoch gerne den Code aus Zeile 18-19 so umschreiben, dass beide Wörter wie in Zeile 17 in einer Zeile ausgegeben werden.

    Gruß
    Geddon



  • Geddon schrieb:

    In Zeile 34 macht die getline() irgendwas kaputt..

    Hallo Geddon,

    woher weißt Du, dass getline die Ursache ist?
    Die Datei words.txt enthält Steuerzeichen in DOS-Format (Also <CR> und <LF>) am Ende jeder Zeile. Du arbeitest wahrscheinlich unter Linux und das getline liest unformatiert(!) bis zum Zeilenende. Zeilenende bei Linux ist <LF> - das bedeutet, dass das <CR> mit am Ende jeder Zeile und damit auch am Ende jedes deutschen Wortes steht. Wenn Du dann ein Deutsches Wort ausgibt, beginnt jede weitere Ausgabe wieder am Anfang der Zeile.

    Also 'cout << vWords.at(i).getDeutsch()' druckt

    1.blau<CR>
    

    <CR> setzt den Schreibzeiger an den Anfang der Zeile und weiter geht es mit: '"-" << vWords.at(i).getEnglisch() << endl;'

    blueau
    

    Ich empfehle Dir ab Zeile 33

    while( getline( getline( inClientFile >> skipws, Englisch, ',' ) >> skipws, Deutsch ) )
            {
                // --   Lösche alles am Ende, was da nicht hingehört
                while( !Deutsch.empty() && isspace( Deutsch[Deutsch.size()-1] ) ) // ggf. #include <cctype> falls nötig
                    Deutsch.erase( --Deutsch.end() );  
                Word wort;
                wort.setEnglisch(Englisch);
                wort.setDeutsch(Deutsch);
                vWords.push_back(wort);
            }
    

    Gruß
    Werner


Anmelden zum Antworten