ifstream ließt letzten Buchstaben doppelt
-
Hey folgendes Problem,
ich habe eine Datei namens vokabularylist.txt, die das Programm einlesen und ausgeben soll. Das funktioniert auch soweit, nur gibt er den letzten Buchstaben doppelt aus.// MAIN_CPP // Programm: Zeilenlese - / schreibe Programm #include "stdafx.h" int CharToInt(char input); using namespace std; // Umlaute darstellen const unsigned char Ä = static_cast<unsigned char>(142); const unsigned char ä = static_cast<unsigned char>(132); const unsigned char Ö = static_cast<unsigned char>(153); const unsigned char ö = static_cast<unsigned char>(148); const unsigned char Ü = static_cast<unsigned char>(154); const unsigned char ü = static_cast<unsigned char>(129); const unsigned char ß = static_cast<unsigned char>(225); int main() { char a; int iChoice; bool bChoice = false; cout << "> 1 - Zeichen einlesen" << endl; cout << "> 2 - Textinhalt l" << ö << "schen und neu eingeben" << endl; cout << "> "; // Zeichen abfragen und in eine Integer Zahl umwandeln // Solange nicht 1 oder 2 eingebeben wurde, iChoice nicht setzen und erneut abfragen while(bChoice == false) { // Zeichen in a speichern a = _getch(); if(a == '1') { iChoice = CharToInt(a); bChoice = true; // iChoice gesetzt -> while-Schleife abbrechen } else if(a == '2') { iChoice = CharToInt(a); bChoice = true; // iChoice gesetzt -> while-Schleife abbrechen } } // Eingabe verwalten if(iChoice == 1) { system("CLS"); const char data_name[] = "vokabularylist.txt"; char letter; string complete_text; ifstream data_in; data_in.open(data_name, ios::in); // Wenn vokabularylist.txt nicht geöffnet werden konnte... if(!data_in.is_open()) { cerr << "Konnte -[ vokabularylist.txt ]- nicht " << ö << "ffnen."; _getch(); exit(EXIT_SUCCESS); // ... dann beenden } // Alle Zeichen einlesen solange das Ende der Datei nicht erreicht ist while(!data_in.eof()) { data_in.get(letter); complete_text += letter; } // Kompletten Text der Datei ausgeben cout << complete_text; } else { // ... } _getch(); return 0; } int CharToInt(char input) { if(input == '1') { return 1; } else { return 2; } }
-
eof() ist erst wahr, sobald man 1 hinters ende gelesen hab.
Mach also mal aus
// Alle Zeichen einlesen solange das Ende der Datei nicht erreicht ist while(!data_in.eof()) { data_in.get(letter); complete_text += letter; }while(!data.in.eof()) { data_.in.get(letter); if(!data_in.eof()) { complete_text += letter; } }
-
Oder etwas kürzer und nicht nur gegen eof sondern alle Arten von Fehlern gesichert:
while(data_.in.get(letter)) complete_text += letter;
-
Hey super danke funktioniert einwandfrei

-
Nimm doch einfach, was C++ schon bietet:
{ std::istreambuf_iterator<char> begin(data_in), end; complete_text.assign(begin, end); }
-
TyRoXx schrieb:
Nimm doch einfach, was C++ schon bietet:
{ std::istreambuf_iterator<char> begin(data_in), end; complete_text.assign(begin, end); }wenn es wirklich nur um das Ausgeben geht, so ist auch der Container
complete_textüberflüssig:#include <fstream> #include <iostream> int main() { using namespace std; const char data_name[] = "vokabularylist.txt"; ifstream data_in( data_name ); // ios::in ist redundant, da ifstream immer eine Input-stream ist // ... // Kompletten Text der Datei ausgeben cout << data_in.rdbuf(); // das ist alles! cin.get(); return 0; }Yoyo2000 schrieb:
.. Das funktioniert auch soweit, nur gibt er den letzten Buchstaben doppelt aus.
while(!data_in.eof()) {siehe dazu den while(!EOF)-Virus.
Gruß
Werner
-
Wieso lässt sich ein Buffer ausgeben?
-
314159265358979 schrieb:
Wieso lässt sich ein Buffer ausgeben?
Weil's der C++-Standard so vorgibt - siehe [lib.ostream.inserters] oder ostream& operator<< (streambuf* sb);.
-
Klingt irgendwie ziemlich pervers. Einen Buffer ausgeben? WTF.