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;
       }
    }
    

  • Mod

    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.


Anmelden zum Antworten