In Datei schreiben

Schnelle objektorientierte, kompilierende Programmiersprache.
hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

In Datei schreiben

Beitrag von hardcoding » Di Jan 22, 2013 1:24 pm

Code: Alles auswählen

// bspl0079.cpp
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;
 
int main() {
	int i=1;
	char zeile[250],datei[50];
	streampos ausgabepos1,anfangpos,endepos;
	cout << "Dateiname: " << flush;
	cin.get(datei,50);
	ifstream eingabe(datei,ios_base::in);
	if (eingabe.good()) {
		ofstream ausgabe("programm.lst",
			ios_base::out | ios_base::in
			| ios_base::ate);
		if (ausgabe.good()) {
			eingabe.seekg(0L,ios::end);
			ausgabe << "Datei: " << datei << "\t"
				<< eingabe.tellg() << " Bytes";
			ausgabepos1=ausgabe.tellp();
			ausgabe << "                          " 
				<< endl;
			for(int j=0; j<80;j++)
				 ausgabe << "_";
			ausgabe << endl;
			eingabe.seekg(0L,ios::beg);
			anfangpos=ausgabe.tellp();
			while (eingabe.good()) {
				eingabe.getline(zeile,250);
				ausgabe << setw(2) << i++ << ":"
					<< zeile << endl;
				if (ausgabe.fail()) {
					cout << "Ausgabedateifehler: Schreiben!"
						<< endl;
					break;
				}
			}
			endepos=ausgabe.tellp();
			ausgabe.seekp(ausgabepos1,ios::beg);
			ausgabe << " alt - Neu: " 
				<< endepos-anfangpos << " Bytes";
		}
		else
			cout << "Ausgabedateifehler!" << endl;
	}
	else
		cout << "Eingabedateifehler oder "
			"Datei nicht gefunden!" << endl;
	return 0;
}
Ich habe das Programm ehrlich gesagt nicht verstanden.

- Per Ifstream wird ein Dateiname eingegeben.

- dann kommt oftstream und keine ahnung was sie da macht

und der Rest verstehe ich sowieso nicht. Hab mein Kopf darüber zerbrochen dennoch verstehe ich es nicht.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: In Datei schreiben

Beitrag von cloidnerux » Di Jan 22, 2013 1:43 pm

und der Rest verstehe ich sowieso nicht. Hab mein Kopf darüber zerbrochen dennoch verstehe ich es nicht.
ifstream = Input File Stream
ofstream = Output File Stream

Mit ifstream legst du also einen Stream an, der mit der Datei verbunden ist, aus der du Lesen möchtest. Dann prüft das Programm, ob das ganze auch Ok ist, also ob die Datei existiert und lesbar ist mit dem

Code: Alles auswählen

 if (eingabe.good()) {
Hast du eine valide Datei und eingabestream, wird ein Ausgabestream erstellt, mit dem du in die Datei schreiben kannst.
Mit

Code: Alles auswählen

eingabe.seekg(0L,ios::end);
         ausgabe << "Datei: " << datei << "\t"
            << eingabe.tellg() << " Bytes";
         ausgabepos1=ausgabe.tellp();
         ausgabe << "                          " 
            << endl;
Wird zum ende der Datei gesprungen(seekg mit Option ios::end). Dann wird wie bei cout mit den << Text "ausgegeben", eben in die Datei geschrieben. Dann wird die Byteposition der Schreib/Lesestelle mit tellp angefragt.
Also insgesamt springt das beispiel bisschen durch eine Datei, schreibt und liest ein paar Daten und zeigt dir die Position innerhalb der Datei an.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: In Datei schreiben

Beitrag von Xin » Di Jan 22, 2013 1:43 pm

Und möchtest Du eine Frage dazu formulieren? ^^

Ich versuche mal eine Antwort: Füge ein paar Leerzeilen in das Programm ein und kommentiere blockweise, was Du da als Quelltext liest. Die Leerzeilen fügst Du immer da ein, wo Du siehst, dass etwas zusammenhängendes passiert und schreibst dann drüber, was Du aus den Zeilen verstehst: "Dateiname für "eingabe" abfragen" zum Beispiel.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: In Datei schreiben

Beitrag von hardcoding » Di Jan 22, 2013 2:43 pm

Code: Alles auswählen

int main() {
   int i=1;
   char zeile[250],datei[50];
[code]   streampos ausgabepos1,anfangpos,endepos;


cout << "Dateiname: " << flush;
cin.get(datei,50);
ifstream eingabe(datei,ios_base::in);[/code]

Hier fragt er nach einen Dateinamen gefragt ,welches mit ifstream geöffnet werden soll.
so interpretiere ich das bis jetzt.

Code: Alles auswählen

 if (eingabe.good()) {
      ofstream ausgabe("programm.lst",
         ios_base::out | ios_base::in
         | ios_base::ate);
Wenn die Bedingung True ist ,kopiert er es in der Datei Programm.lst

Code: Alles auswählen

if (ausgabe.good()) {
         eingabe.seekg(0L,ios::end);
         ausgabe << "Datei: " << datei << "\t"
            << eingabe.tellg() << " Bytes";
         ausgabepos1=ausgabe.tellp();
         ausgabe << "                          " 
            << endl;
Hier springt er am Anfang der Datei und gibt mit

Code: Alles auswählen

ausgabe 
den Dateinamen aus.
Die Dateizeigerposition wird ermittelt?! Wozu es wurde doch schon mittels ofstream geschrieben.

Code: Alles auswählen

         for(int j=0; j<80;j++)
             ausgabe << "_";
         ausgabe << endl;
         eingabe.seekg(0L,ios::beg);
         anfangpos=ausgabe.tellp();
         while (eingabe.good()) {
            eingabe.getline(zeile,250);
            ausgabe << setw(2) << i++ << ":"
               << zeile << endl;
Und hier springt er irgendwie die ganze Zeit rum. Er springt zum Anfang der Datei. Ich weiß auch nicht wozu. naja getline liest das irgendwie alles ein. keine ahnung

Code: Alles auswählen

endepos=ausgabe.tellp();
         ausgabe.seekp(ausgabepos1,ios::beg);
         ausgabe << " alt - Neu: " 
            << endepos-anfangpos << " Bytes";
Dateigröße wird ermittelt.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: In Datei schreiben

Beitrag von Xin » Di Jan 22, 2013 3:14 pm

hardcoding hat geschrieben:

Code: Alles auswählen

int main() {
   int i=1;
   char zeile[250],datei[50];
[code]   streampos ausgabepos1,anfangpos,endepos;


cout << "Dateiname: " << flush;
cin.get(datei,50);
ifstream eingabe(datei,ios_base::in);[/code]

Hier fragt er nach einen Dateinamen gefragt ,welches mit ifstream geöffnet werden soll.
so interpretiere ich das bis jetzt.
So sehe ich das auch. :-)
hardcoding hat geschrieben:

Code: Alles auswählen

 if (eingabe.good()) {
      ofstream ausgabe("programm.lst",
         ios_base::out | ios_base::in
         | ios_base::ate);
Wenn die Bedingung True ist ,kopiert er es in der Datei Programm.lst
Was kopiert er denn!? Er erzeugt doch nur die Datei "programm.lst".
hardcoding hat geschrieben:

Code: Alles auswählen

if (ausgabe.good()) {
         eingabe.seekg(0L,ios::end);
         ausgabe << "Datei: " << datei << "\t"
            << eingabe.tellg() << " Bytes";
         ausgabepos1=ausgabe.tellp();
         ausgabe << "                          " 
            << endl;
Hier springt er am Anfang der Datei und gibt mit

Code: Alles auswählen

ausgabe 
den Dateinamen aus.
Die Dateizeigerposition wird ermittelt?! Wozu es wurde doch schon mittels ofstream geschrieben.
Meinst Du ausgabe1? Interessante Frage... er hat schon was geschrieben, dann merkt er sich die Position und schreibt mehrere Leerzeichen... In ausgabepos1 steht also drin, wo die Leerzeichen anfangen.
hardcoding hat geschrieben:

Code: Alles auswählen

         for(int j=0; j<80;j++)
             ausgabe << "_";
         ausgabe << endl;

         eingabe.seekg(0L,ios::beg);
         anfangpos=ausgabe.tellp();
         while (eingabe.good()) {
            eingabe.getline(zeile,250);
            ausgabe << setw(2) << i++ << ":"
               << zeile << endl;
Und hier springt er irgendwie die ganze Zeit rum. Er springt zum Anfang der Datei. Ich weiß auch nicht wozu. naja getline liest das irgendwie alles ein. keine ahnung
Zum einen macht er mal 80 '_'-Zeichen hintereinander und dann eine Newline. Also eine Zeile mit einer Text-Linie.

Dann springt er in der Eingabe an die erste Position und merkt sich bei der Ausgabe die Position in der Variablen "anfangpos".

Dann Beginn eine While-Schleife: Solange da noch eingaben kommen... Er liest eine Text-Zeile aus der Eingabedatei ein und speichert sie in der Variablen "zeile", das Char-Array am Anfang.
Anschließend schreibt er in die Ausgabedatei eine Zahl - die Zeilennummer - gefolgt von einem Doppelpunkt und anschließend die gelesene Zeile. Die geschweifte Klammer dahinter fehlt.
hardcoding hat geschrieben:

Code: Alles auswählen

endepos=ausgabe.tellp();
         ausgabe.seekp(ausgabepos1,ios::beg);
         ausgabe << " alt - Neu: " 
            << endepos-anfangpos << " Bytes";
Dateigröße wird ermittelt.
Hier speichert er die Endposition der Ausgabedatei.
Anschließend springt er zurück an die Stelle, die er sich zuvor gemerkt hat, da wo die Leerzeichen sind und überschreibt die Leerzeichen mit endepos-anfangspos. Ich habe keine Ahnung, wieso er sich für die Größe der Geschriebenen Daten ohne die erste Zeile interessiert, aber das lese ich nunmal aus dem Quelltext. Ich vermute eher, dass hier die Größe der Eingabedatei gefragt war, aber ich weiß ja nicht, was der Autor des Quelltextes sich vorgestellt hat und Programme machen ja auch nur, was man ihnen sagt. :-)


Wenn Du den Quelltext mit "Und hier springt er irgendwie die ganze Zeit rum." beschreibst, weil Du es nicht besser verstehst, dann sind die Blöcke zu groß. Achte darauf, was mit welcher Variablen passiert. Notfalls kommentiere Zeilenweise, so dass Du neben dem Programmtext eine Art Aufsatz bekommst, was da passiert. Dann erst fasst Du es Blockweise zusammen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: In Datei schreiben

Beitrag von hardcoding » Di Jan 22, 2013 4:28 pm

Code: Alles auswählen

Meinst Du ausgabe1? Interessante Frage... er hat schon was geschrieben, dann merkt er sich die Position und schreibt mehrere Leerzeichen... In ausgabepos1 steht also drin, wo die Leerzeichen anfangen.
Wer ist er ? und was ist was ?
Ist das er

Code: Alles auswählen

 ausgabe << "Datei: " << datei << "\t"
? Wenn ja was hat er geschrieben ?

Dann springt er in der Eingabe an die erste Position und merkt sich bei der Ausgabe die Position in der Variablen "anfangpos".
Wozu ?
Dann Beginn eine While-Schleife: Solange da noch eingaben kommen... Er liest eine Text-Zeile aus der Eingabedatei ein und speichert sie in der Variablen "zeile", das Char-Array am Anfang.
Anschließend schreibt er in die Ausgabedatei eine Zahl - die Zeilennummer - gefolgt von einem Doppelpunkt und anschließend die gelesene Zeile. Die geschweifte Klammer dahinter fehlt.
Aha er beginnt hier zu schreiben.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: In Datei schreiben

Beitrag von Xin » Di Jan 22, 2013 4:36 pm

hardcoding hat geschrieben:

Code: Alles auswählen

Meinst Du ausgabe1? Interessante Frage... er hat schon was geschrieben, dann merkt er sich die Position und schreibt mehrere Leerzeichen... In ausgabepos1 steht also drin, wo die Leerzeichen anfangen.
Wer ist er ? und was ist was ?
Er ist der, der er das Programm geschrieben hat.
Und "was" ist ein Fragewort, dem in der Regel eine Frage folgt.
hardcoding hat geschrieben:Ist das er

Code: Alles auswählen

 ausgabe << "Datei: " << datei << "\t"
? Wenn ja was hat er geschrieben ?
"Datei: " gefolgt vom eingegebenen Dateinamen?
hardcoding hat geschrieben:
Dann springt er in der Eingabe an die erste Position und merkt sich bei der Ausgabe die Position in der Variablen "anfangpos".
Wozu ?
Frag den Menschen, der das Programm geschrieben hat? Offenbar möchte er beginnend von der Stimme an zählen, wieviele Bytes er schreibt!?
hardcoding hat geschrieben:
Dann Beginn eine While-Schleife: Solange da noch eingaben kommen... Er liest eine Text-Zeile aus der Eingabedatei ein und speichert sie in der Variablen "zeile", das Char-Array am Anfang.
Anschließend schreibt er in die Ausgabedatei eine Zahl - die Zeilennummer - gefolgt von einem Doppelpunkt und anschließend die gelesene Zeile. Die geschweifte Klammer dahinter fehlt.
Aha er beginnt hier zu schreiben.
Geschrieben hat er ja vorher schon - da beginnt er Daten zu kopieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: In Datei schreiben

Beitrag von hardcoding » Di Jan 22, 2013 4:59 pm

Mal anders gefragt. In welchen codesegment wird in der Datei Programm.lst geschrieben

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: In Datei schreiben

Beitrag von Xin » Di Jan 22, 2013 5:01 pm

hardcoding hat geschrieben:Mal anders gefragt. In welchen codesegment wird in der Datei Programm.lst geschrieben
ausgabe ist der Ausgabestream, der in die Datei "Programm.lst" schreibt.
Alles was nach ausgabe geschickt wird, landet also in der Datei:

Code: Alles auswählen

ausgabe << "Ich lande in der Datei";
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: In Datei schreiben

Beitrag von hardcoding » Di Jan 22, 2013 5:18 pm

Alles klar.

Code: Alles auswählen

for(int j=0; j<80;j++)
             ausgabe << "_";
         ausgabe << endl;

         eingabe.seekg(0L,ios::beg);
         anfangpos=ausgabe.tellp();
         while (eingabe.good()) {
            eingabe.getline(zeile,250);
            ausgabe << setw(2) << i++ << ":"
               << zeile << endl;
Naja dieses Codesegment ist eig überflüssig weil das Programm nur in die programm.lst schreiben sollte.

Antworten