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 keinenchar
sondern einenint
der auch EOF sein könnte.
Warum gibst du beim Öffnen der Dateienios::in
bzw.ios::out
explizit an?
Warum öffnest du reine Textdateienios::binary
?
Warum benutzt du zum öffnen nicht einfach den Konstruktor vonifstream
bzw.ofstream
?
Warum gibt es keine Fehlerprüfung?Lesen geht normalerweise so:
Leserversuch -> war ok? -> verarbeitenDu machst:
war ok? -> Leseversuch -> verarbeitenDas
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 keinenchar
sondern einenint
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 vonifstream
bzw.ofstream
?
Dassystem()
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 (!) gerneBitte:
#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 keinenchar
sondern einenint
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 vonifstream
bzw.ofstream
?
Dassystem()
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.