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(); } }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;'
blueauIch 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