Fehler bei Einlesen/Ausgeben von Textdateien



  • hey, ich möchte gerne den Text aus meiner Datei-1 in Datei-2 Ausgeben mit Ersetzung des buchstabens "e" durch ein "!"!

    bsp: datei1.txt : "wie geht es dir?"
    -> datei2.txt: "wi! g!ht !s dir?"

    mein programm bis jetzt:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main() 
    {
    	string datei1, datei2;
    	char c;
    	ifstream einlesen;
    	ofstream ausgeben;
    
    	einlesen.open("datei1.txt", ios::in | ios::binary);
    	ausgeben.open("datei2.txt", ios::out | ios::binary);
    
    	while (!einlesen.eof())
    	{
    		c=einlesen.get();
    
    		if (c == 'e')
    			c = '!';
    
    		ausgeben.put(c);
    	}
    
    	system("PAUSE");
    	return 0;
    }
    

    bei ausführung passiert im fenster nichts (es erscheint auch nicht "Drücken Sie eine beliebige Taste . . .").
    und auch in der text-datei 2 verändert sich nicht bzw. sie ist nach wie vor leer.

    wo ist der fehler?
    tipps was man beim einlesen/ausgeben von dateien beachten sollte?
    danke schonmal.
    grüße



  • Wofür die zwei string s?
    ifstream::get() liefert keinen char sondern einen int der auch EOF sein könnte.
    Warum gibst du beim Öffnen der Dateien ios::in bzw. ios::out explizit an?
    Warum öffnest du reine Textdateien ios::binary ?
    Warum benutzt du zum öffnen nicht einfach den Konstruktor von ifstream bzw. ofstream ?
    Warum gibt es keine Fehlerprüfung?

    Lesen geht normalerweise so:
    Leserversuch -> war ok? -> verarbeiten

    Du machst:
    war ok? -> Leseversuch -> verarbeiten

    Das system() grausig ist, hat man dir doch sicher schonmal gesagt?

    Dangling schrieb:

    bei ausführung passiert im fenster nichts (es erscheint auch nicht "Drücken Sie eine beliebige Taste . . .").
    und auch in der text-datei 2 verändert sich nicht bzw. sie ist nach wie vor leer.

    Dann führst du entweder ein anderes Programm aus oder es is sonst was an deiner Umgebung kaputt.



  • Swordfish schrieb:

    Wofür die zwei string s?

    hab mein programm verkürzt fürs forum und die zeile vergessen rauszunehmen

    Swordfish schrieb:

    ifstream::get() liefert keinen char sondern einen int der auch EOF sein könnte.

    ich hatte es auch mit der zeile

    einlesen.get(c)
    

    (das speichert doch das eingelesene zeichen in eine char-variable oder?), aber hatte mich auch nicht weiter gebracht 😕

    Swordfish schrieb:

    Warum gibst du beim Öffnen der Dateien ios::in bzw. ios::out explizit an?
    Warum benutzt du zum öffnen nicht einfach den Konstruktor von ifstream bzw. ofstream ?
    Das system() grausig ist, hat man dir doch sicher schonmal gesagt?

    vom professor so vorgegeben/beigebracht



  • neue textdateien abgespeichert, pc neu gestartet, c=einlesen.get() zu einlesen.get(c) verändert.
    funktioniert jetzt.

    ENTSCHULDIGUNG FÜR DEN ZEITRAUB!

    falls es noch tipps gibt beim umgehen mit stream-objekten, textdatei-operationen:
    Sehr (!) gerne



  • Hallo Dangling,

    Dangling schrieb:

    falls es noch tipps gibt beim umgehen mit stream-objekten, textdatei-operationen:
    Sehr (!) gerne

    Bitte:

    #include <algorithm>    // transform
    #include <fstream>
    #include <iterator>     // i(o)stream_iterator
    #include <iostream>
    
    int main()
    {
        using namespace std;
        ifstream einlesen("datei.txt");
        if( !einlesen.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return 0;
        }
        ofstream ausgeben("datei2.txt");
    
        einlesen >> noskipws;   // .. damit auch alle Leerzeichen mitgenommen werden
        transform( istream_iterator< char >( einlesen ), istream_iterator< char >(), 
            ostream_iterator< char >( ausgeben ), []( char c ) { return c=='e'? '!': c; } );
        if( einlesen.eof() && ausgeben )
            cout << "alles gut!" << endl;
        return 0;
    }
    

    und noch was:

    Dangling schrieb:

    mein programm bis jetzt:

    einlesen.open("datei1.txt", ios::in | ios::binary);
    	ausgeben.open("datei2.txt", ios::out | ios::binary);
    
    	while (!einlesen.eof())
    	{
    		c=einlesen.get();
    

    .. falls Du das mit 'while(!EOF)' auch von Deinem Prof gelernt hast, so würde ich an Deiner Stelle den Prof wechseln.

    Gruß
    Werner



  • Dangling schrieb:

    Swordfish schrieb:

    ifstream::get() liefert keinen char sondern einen int der auch EOF sein könnte.

    ich hatte es auch mit der zeile

    einlesen.get(c)
    

    (das speichert doch das eingelesene zeichen in eine char-variable oder?), aber hatte mich auch nicht weiter gebracht 😕

    ifstream::get() gibt es in mehreren Geschmacksrichtungen. Du solltest dir anschaun was was zurückgibt: http://www.cplusplus.com/reference/istream/istream/get/

    Dangling schrieb:

    Swordfish schrieb:

    Warum gibst du beim Öffnen der Dateien ios::in bzw. ios::out explizit an?
    Warum benutzt du zum öffnen nicht einfach den Konstruktor von ifstream bzw. ofstream ?
    Das system() grausig ist, hat man dir doch sicher schonmal gesagt?

    vom professor so vorgegeben/beigebracht

    War zu befürchten.

    Dangling schrieb:

    neue textdateien abgespeichert, pc neu gestartet, c=einlesen.get() zu einlesen.get(c) verändert.
    funktioniert jetzt.

    Die Datei lag wahrscheinlich einfach nicht im Arbeitsverzeichnis deines Programms.



  • Werner Salomon schrieb:

    einlesen >> noskipws;   // .. damit auch alle Leerzeichen mitgenommen werden
        transform( istream_iterator< char >( einlesen ), istream_iterator< char >(), 
            ostream_iterator< char >( ausgeben ), []( char c ) { return c=='e'? '!': c; } );
    

    Ich würde auf istream_buf-Iteratoren umsteigen und ausserdem replace_copy verwenden:

    replace_copy(istreambuf_iterator<char>( einlesen ),
                   istreambuf_iterator<char>(), // bzw "{}," mit C++11
                   ostreambuf_iterator<char>( ausgeben ),
                   'e', '!');
    

    Leider geht der Check am Schluss dann nicht mehr so schön.


Anmelden zum Antworten