Dateien einlesen (und später auch schreiben)
-
Hallo!
Mal eine Fragen zum dem Quelltext:
#include <fstream> #include <iostream> using namespace std; void Lesen(char *Dateiname) { ifstream Lese(Dateiname); char Byte; bool Schalter = 0; //Switch für die Auswahl von Datei 1 & 2 if(Lese) { while(!Lese.eof()) { Lese >> Byte; Schalter = 1 - Schalter; //Switch umlegen if (Schalter) { cout << Byte; //hier kommt das Schreiben in Datei 1 } else { cout << Byte; //hier in die andere } } } else { cout << "Datei nicht gefunden!" << endl; } } int main() { char Name[255]; cout << "Dateiname eingeben:" << endl; cin.getline(Name, 254); Lesen(Name); return 0; }
Einiges verstehe ich nicht.
1. Was ist ifstream ? & Was macht es in dem Fall?
2. Was ist using namespace std; ?
3. Das Programm läuft uns liest mir auch eine Datei ein und gibt sie aus. Aber woher nimmt der Autor des Progs die Funktion Lese()??? Die ist doch gar nicht dekl. ? Und sie klingt ziehmlich deutsch, also ist die wohl kaum mitgeliefert, oder doch?? & Was macht Lese()?
4. Vielleicht kann mir jemand das Programm ausführlich kommentieren?BESTEN DANK!
-
Zu 1.+3.:
ifstream ist eine Stream-Klasse von C++ und sie ermöglicht das Lesen von Dateien. Die Variable Lese ist nichts anderes als eine Instanz von ifstream, die die Datei, die der Funktion "Lesen" als Variable "Dateiname übergeben wurde zum lesen öffnet. Die Funktin "Lesen" wird übrigens vor der main-Funktion definiert.
Danach wird zuerst geprüft, ob die Datei erfolgreich geöffnet werden konnteif (Lese) { ...
Darauf folgt eine Schleife, die abbricht, wenn das Dateiende erreicht wird
while(!Lese.eof() { ...
und die Datei wird zeichen für zeichen ausgelesen
Lese >> Byte;
und das gelesene Zeichen ausgegeben
cout << Byte;
Die Variable Schalter erfüllt in dem Programm (zumindest so wie Du es hier zeigst) keine sinnvolle Funktion: Es gibt keine 2 Dateien, in die geschrieben werden könnte. Die Ausgabe erfolgt auf den Bildschirm.
Hier der "gesäuberte" Code:
#include <fstream> #include <iostream> using namespace std; void Lesen(char *Dateiname) { ifstream Lese(Dateiname); char Byte; if(Lese) { while(!Lese.eof()) { Lese >> Byte; cout << Byte; } } else { cout << "Datei nicht gefunden!" << endl; } } int main() { char Name[255]; cout << "Dateiname eingeben:" << endl; cin.getline(Name, 254); Lesen(Name); return 0; }
zu 2.: Ein Namespace ist dazu da, um Konflikte in der Benennung von (globalen) Variablen und Funktionen zu vermeiden. Innerhalb eines Namespace sind können alle Namen vergeben werden, auch wenn diese bereits in einem anderen Namespace definiert sind. Innerhalb eines Namespace muss ein Name allerdings eindeutig sein!
Du kannst also z.B. im Namespace A eine (globale) Variable namens "Test" verwenden und im Namespace B ebenfalls eine Variable namens "Test", ohne dass die sich in die Quere kommen. Nützlich ist das v.a. bei grossen Projekten. Bei kleineren Sachen ist es meistens kein Problem, die Variablen gescheit zu benennen. Der Namespace std steht für die Variablen- und Funktionsnamen, die in C++ standardmässig definiert sind.Ich nehme an, Du hast davon jetzt auch noch nicht alles verstanden. Mir scheint, Du hast noch nicht allzu viel mit C++ oder überhaupt mit dem Programmieren zu tun gehabt. Das beste ist, Du besorgst Dir mal ein gutes Buch, das Dir diese Dinge gut und ausführlich erklären kann. Auf dieser Seite gibts ja auch eine Bücherecke, da kannst Du dich ja mal umschauen!
Gruss,
Andreas
-
Hallo.
Danke für die Antwort. Habe das meist egerafft.
Die Schalteranweisungen habe ich eingebaut, damit ich später jedes Zeichen abwechselnd in unterschiedliche Dateien schreiben kann.Wie kann ich das nun machen?
PS: Bin der Empfehlung gefolgt, und habe in der letzten Woche ein ganzes Buch durchgefressen (600 Seiten)! Habe wohl durch die kurze Zeit auch die hälfte vergessen !
Leider stand nichts, - aber auch gar nichts über laden und speichern (ifstream etc.) drin. Bin also auch nicht in dem Bereich schlauer als vorher.
Sollte ich aber sein, da ich Informatik studiere
Der ifstream-Bereich scheint aber auch nicht soooo gewaltig groß zu sein, dass ich mir dafür noch ein Buch anschaffen müsste ?! Deswegen hoffe ich auf eure Hilfe!!! DAAAAANNNNKKKKEEEEEEEE!!!!
-
Für das Schreiben in Dateien ist die Klasse ofstream zuständig.
Mitofstream MyFile("Dateiname");
erstellst Du eine neue Datei. Vorsicht: Falls schon eine Datei mit dem angegebenen Namen existiert, wird ihr Inhalt gelöscht!
Schreiben in eine Datei geht so:MyFile << Daten;
Damit solltest Du in der Lage sein, Deine Ausgabe in 2 Dateien umzulenken.
Am Schluss des Programms solltest Du die Dateien wieder schliessen:MyFile.close();
Es gibt noch viele andere Filehandles, aber dafür solltest Du wirklich ein Buch darüber lesen.
Ein gutes Einführungsbuch ist z.B. "C++ lernen und professionell anwenden" (Peter Prinz, Ulla Kirch-Prinz), das auch 2 Kapitel über Dateiverarbeitung enthält. Später wirst Du noch weitere Bücher brauchen, z.B. eins über die Standardbibliothek (v.a. wegen Containern und Algorithmen, die im Einführungsbuch wirklich sehr schlecht beschrieben werden...). Aber für den Anfang reicht das Buch sicher aus.
Übrigens: Es gibt zwar (meines Wissens) keine Bücher, die sich nur mit ifstream beschäftigen, aber sehr wohl Bücher, die sich ausschliesslich mit den I/O-Streams (dazu gehören auch ifstream und ofstream) von C++ beschäftigen, z.B. "Die C++ iostreams-Library" (Bernd Eggink).
-
Super Danke!
Werde das gleich ausprobieren!
Und auch danke für das Literaturverzeichnis, - schaue mich mal um.Hades+