c++ schreibt nicht in datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

c++ schreibt nicht in datei

Beitrag von mampfi » 20.02.2019 18:05:15

Bin grad betriebsblind, Datei wird zwar erzeugt (openfile), jedoch nichts hinein- geschrieben (writerec)
Vielleicht weiß jemand Rat


[np]
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

#include "stdio.h"
#include "string.h"

using namespace std;

//#include "/media/daten/prog/c/lib/pascal.hpp"
//#include "/media/daten/prog/c/lib/convert.hpp"



/////////////// Globale Variablen ///////////////

char debug;


struct rectype
{
string feld_nachname_string;
int feld_nachname_breite;

string feld_vorname_string;
int feld_vorname_breite;

string feld_telefon_string;
int feld_telefon_breite;
}; //rec;


/////////////// Ende Globale Variablen ///////////////


class rec_oop_file_class
{
private:

protected:

fstream datei;
int i;

public:
//protected: geht nicht

struct rectype rec;
struct rectype *recpointer;


void init_rec();

rec_oop_file_class(string para_dateiname_string);
~rec_oop_file_class();

void open_file();

void writerec();
void writerec_nr(int position);

int recsize;

void set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string);

void show_vars();

string dateiname_string;
}; //rec_oop_file_class

void rec_oop_file_class::init_rec()


{
set_vars("dummy nachname", "dummy vorname", "dummy 123");
} //init_rec



//----- KONSTRUKTOR ---------------------------------------

rec_oop_file_class::rec_oop_file_class(string para_dateiname_string)

{
dateiname_string = para_dateiname_string;

init_rec();

debug = 0;
if (debug == 1)
{
cout << "Hier ist KONSTRUKTOR rec_oop_file_class::~rec_oop_file_class() dateiname_string = " << dateiname_string << endl; //debug
}


recsize = rec.feld_nachname_breite + rec.feld_vorname_breite + rec.feld_telefon_breite;

debug = 0;
if (debug == 1)
{
cout << "Hier ist KONSTRUKTOR rec_oop_file_class::~rec_oop_file_class() recsize berechnet = " << recsize << endl; //debug
cout << "Hier ist KONSTRUKTOR rec_oop_file_class::~rec_oop_file_class() recsize manuell wenn gesetzt= " << recsize << endl; //debug
} //debug

} //rec_oop_file_class::rec_oop_file_class
//----- KONSTRUKTOR ENDE ---------------------------------------



//----- DESTRUKTOR ---------------------------------------
rec_oop_file_class::~rec_oop_file_class()
{
datei.close();

debug = 0;
if (debug == 1)
{
cout << "Hier ist openfile berechnet = " << recsize << endl; //debug
}

} //rec_oop_file_class
//----- DESTRUKTOR ENDE ----------------------------------


void rec_oop_file_class::open_file()

{
fstream f(dateiname_string, ios::out);

debug = 0;

if (debug == 1)
{
cout << "Hier ist openfile dateiname_string = " <<dateiname_string;
}

} //rec_oop_file_class::open_file()


void rec_oop_file_class::writerec()

{
debug = 1;
if (debug == 1)
{
cout << "Hier ist writerec" << endl; //debug
} //debug

if (datei)
{
datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
}
else
{
cout << "Datei ist geschlossen" << endl;
exit(0);
}
} //rec_oop_file_class::writerec



void rec_oop_file_class::writerec_nr(int position)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist writerec_nr()" << endl; //debug
cout << "Hier ist writerec_nr() recsize=" << recsize << endl; //debug
} //debug

datei.seekp(position*recsize);

writerec();
} //rec_oop_file_class_nr


void rec_oop_file_class::set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist set_vars" << endl; //debug
} //debug

rec.feld_nachname_string = para_feld_nachname_string;
rec.feld_vorname_string = para_feld_vorname_string;
rec.feld_telefon_string = para_feld_telefon_string;

rec.feld_nachname_breite = 20;
rec.feld_vorname_breite = 20;
rec.feld_telefon_breite = 20;
} //set_var


void rec_oop_file_class::show_vars()

{
cout << "Hier ist show_vars() rec.feld_nachname_string=" << rec.feld_nachname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_nachname_breite=" << rec.feld_nachname_breite << endl; //debug

cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_vorname_breite=" << rec.feld_vorname_breite << endl; //debug

cout << "Hier ist show_vars() rec.feld_telefon_string=" << rec.feld_telefon_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_telefon_breite=" << rec.feld_telefon_breite << endl; //debug
} //show_vars()



////////////////////////////////////////////////////// main //////////////////////////////////////////////////////


// schon rec_oop_file_class > 6.3.18

int main()

{
rec_oop_file_class f("datei.txt"); //Konstruktor ruft init_rec() öffnet aber nicht die datei

f.open_file();

f.set_vars("Zahlhaas", "Manfred", "6972489");
f.show_vars();
f.writerec();



cout << endl << endl<< endl<< endl<< endl<< endl<< endl;
}



[/np]
Es gibt viele Foren

DeletedUserReAsG

Re: c++ schreibt nicht in datei

Beitrag von DeletedUserReAsG » 20.02.2019 18:39:07

mampfi hat geschrieben: ↑ zum Beitrag ↑
20.02.2019 18:05:15
Vielleicht weiß jemand Rat
Klar: ersetze [np] durch [​code], dann kann man es sogar lesen, und jemand, der sich damit auskennt, kann was dazu schreiben. Außerdem: die Tags deuten darauf hin, dass es ebenfalls in ’nem weiteren Forum gepostet wurde – das solltest du verlinken; ungekennzeichnete Cross-Posts gelten als sehr unhöflich.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: c++ schreibt nicht in datei

Beitrag von JTH » 20.02.2019 19:16:54

niemand hat geschrieben: ↑ zum Beitrag ↑
20.02.2019 18:39:07
Klar: ersetze [np] durch [​code], dann kann man es sogar lesen
Ja, bitte!

Du öffnest effektiv nie die Datei, in die du schreiben möchtest. In rec_oop_file_class::open_file() wird zwar lokal, temporär ein std::fstream für dateiname_string geöffnet, für die Membervariable rec_oop_file_class::datei passiert das aber nicht.

Ein simpler Lösungsvorschlag:

Code: Alles auswählen

datei = f;
in rec_oop_file_class::open_file() ergänzen.

C++-typischer wäre es, die Datei bzw. den std::fstream direkt richtig im Konstruktor zu öffnen, in der Member-Initializer-Liste:

Code: Alles auswählen

rec_oop_file_class::rec_oop_file_class(string para_dateiname_string)
    : datei(para_dateiname_string)
{
    […]
}
Manchmal bekannt als Just (another) Terminal Hacker.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 23.02.2019 13:43:45

niemand hat geschrieben: ↑ zum Beitrag ↑
20.02.2019 18:39:07
mampfi hat geschrieben: ↑ zum Beitrag ↑
20.02.2019 18:05:15
Vielleicht weiß jemand Rat
Klar: ersetze [np] durch [​code], dann kann man es sogar lesen, und jemand, der sich damit auskennt, kann was dazu schreiben. Außerdem: die Tags deuten darauf hin, dass es ebenfalls in ’nem weiteren Forum gepostet wurde – das solltest du verlinken; ungekennzeichnete Cross-Posts gelten als sehr unhöflich.

Jetzt probier ich code aus, Ergänzend ist zu sagen das der Konstrukter impliziert einen NAMEN fesgelegt openfile() musd explicit aufgerufen werden

[deb]
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

#include "stdio.h"
#include "string.h"

using namespace std;

//#include "/media/daten/prog/c/lib/pascal.hpp"
//#include "/media/daten/prog/c/lib/convert.hpp"



/////////////// Globale Variablen ///////////////

char debug;


struct rectype
{
string feld_nachname_string;
int feld_nachname_breite;

string feld_vorname_string;
int feld_vorname_breite;

string feld_telefon_string;
int feld_telefon_breite;
}; //rec;


/////////////// Ende Globale Variablen ///////////////


class rec_oop_file_class
{
private:

protected:

fstream datei;
int i;

public:
//protected: geht nicht

struct rectype rec;
struct rectype *recpointer;


void init_rec();

rec_oop_file_class(string para_dateiname_string);
~rec_oop_file_class();

void open_file();

void writerec();
void writerec_nr(int position);

int recsize;

void set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string);

void show_vars();

string dateiname_string;
}; //rec_oop_file_class

void rec_oop_file_class::init_rec()


{
set_vars("dummy nachname", "dummy vorname", "dummy 123");
} //init_rec



//----- KONSTRUKTOR ---------------------------------------

rec_oop_file_class::rec_oop_file_class(string para_dateiname_string)

{
dateiname_string = para_dateiname_string;

init_rec();

debug = 0;
if (debug == 1)
{
cout << "Hier ist KONSTRUKTOR rec_oop_file_class::~rec_oop_file_class() dateiname_string = " << dateiname_string << endl; //debug
}


recsize = rec.feld_nachname_breite + rec.feld_vorname_breite + rec.feld_telefon_breite;

debug = 0;
if (debug == 1)
{
cout << "Hier ist KONSTRUKTOR rec_oop_file_class::~rec_oop_file_class() recsize berechnet = " << recsize << endl; //debug
cout << "Hier ist KONSTRUKTOR rec_oop_file_class::~rec_oop_file_class() recsize manuell wenn gesetzt= " << recsize << endl; //debug
} //debug

} //rec_oop_file_class::rec_oop_file_class
//----- KONSTRUKTOR ENDE ---------------------------------------



//----- DESTRUKTOR ---------------------------------------
rec_oop_file_class::~rec_oop_file_class()
{
datei.close();

debug = 0;
if (debug == 1)
{
cout << "Hier ist openfile berechnet = " << recsize << endl; //debug
}

} //rec_oop_file_class
//----- DESTRUKTOR ENDE ----------------------------------


void rec_oop_file_class::open_file()

{
ofstream f(dateiname_string, ios::out);

debug = 0;

if (debug == 1)
{
cout << "Hier ist openfile dateiname_string = " <<dateiname_string;
}

} //rec_oop_file_class::open_file()


void rec_oop_file_class::writerec()

{
debug = 1;
if (debug == 1)
{
cout << "Hier ist writerec" << endl; //debug
} //debug

if (datei)
{
datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
}
else
{
cout << "Datei ist geschlossen" << endl;
exit(0);
}
} //rec_oop_file_class::writerec



void rec_oop_file_class::writerec_nr(int position)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist writerec_nr()" << endl; //debug
cout << "Hier ist writerec_nr() recsize=" << recsize << endl; //debug
} //debug

datei.seekp(position*recsize);

writerec();
} //rec_oop_file_class_nr


void rec_oop_file_class::set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist set_vars" << endl; //debug
} //debug

rec.feld_nachname_string = para_feld_nachname_string;
rec.feld_vorname_string = para_feld_vorname_string;
rec.feld_telefon_string = para_feld_telefon_string;

rec.feld_nachname_breite = 20;
rec.feld_vorname_breite = 20;
rec.feld_telefon_breite = 20;
} //set_var


void rec_oop_file_class::show_vars()

{
cout << "Hier ist show_vars() rec.feld_nachname_string=" << rec.feld_nachname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_nachname_breite=" << rec.feld_nachname_breite << endl; //debug

cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_vorname_breite=" << rec.feld_vorname_breite << endl; //debug

cout << "Hier ist show_vars() rec.feld_telefon_string=" << rec.feld_telefon_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_telefon_breite=" << rec.feld_telefon_breite << endl; //debug
} //show_vars()



////////////////////////////////////////////////////// main //////////////////////////////////////////////////////


// schon rec_oop_file_class > 6.3.18

int main()

{
rec_oop_file_class f("datei.txt"); //Konstruktor ruft init_rec() öffnet aber nicht die datei

f.open_file();

f.set_vars("Zahlhaas", "Manfred", "6972489");
f.show_vars();
f.writerec();



cout << endl << endl<< endl<< endl<< endl<< endl<< endl;
}


[/deb]
Es gibt viele Foren

DeletedUserReAsG

Re: c++ schreibt nicht in datei

Beitrag von DeletedUserReAsG » 23.02.2019 13:45:52

Was bezweckst du damit, den Code in [deb​] oder in [np]-Tags zu schreiben, statt in Code-Tags, wodurch er tatsächlich lesbar würde?

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: c++ schreibt nicht in datei

Beitrag von JTH » 23.02.2019 18:57:14

mampfi hat geschrieben: ↑ zum Beitrag ↑
23.02.2019 13:43:45
Jetzt probier ich code aus
Hat sich denn dabei noch etwas ergeben?

Dein zweiter Codeschnipsel hat weiter das Problem, dass die Klassenmembervariable datei nie mit einem tatsächlichen Dateinamen „geöffnet“ wird. In rec_oop_file_class::writerec() wirst du damit immer die Ausgabe „Datei ist geschlossen“ bekommen.

Mein erster Lösungsvorschlag oben war übrigens Quatsch, sorry.

Wenn du die Datei tatsächlich erst in der Funktion rec_oop_file_class::open_file() öffnen möchtest, brauchst du dort eine Zeile

Code: Alles auswählen

datei = std::ofstream(dateiname_string);
anstelle dieser Zeile

Code: Alles auswählen

ofstream f(dateiname_string, ios::out);

Der C++-typische Weg wäre wie gesagt, die Datei direkt im Konstruktor zu öffnen, wie oben vorgeschlagen. Du kannst dann trotzdem den Dateinamen noch der Membervariablen dateiname_string zuweisen.

Nebenbei:

Code: Alles auswählen

std::ofstream ofs("/a/b/c");
ist das gleiche wie

Code: Alles auswählen

std::fstream fs("/a/b/c", std::ios::out);
Manchmal bekannt als Just (another) Terminal Hacker.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 01:24:13

So nun habe ich alles mögliche probiert und diesen Thread vergessen.

*sorry*

Werde mit dem aktuellen Program wiederkehren.
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 09:55:50

Das Öffnen der Datei ist nun openfile

Der Konstruktur macht nun nichts mehr (ausser debug-Ausgabe)

Die Datei ist nun vorhanden, korrekt mit dem gewünschten Namen

jedoch ohne Inhalt
Zuletzt geändert von mampfi am 27.03.2019 10:23:40, insgesamt 3-mal geändert.
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 09:57:15

<code>
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

#include "stdio.h"
#include "string.h"

using namespace std;

//#include "/media/daten/prog/c/lib/pascal.hpp"
//#include "/media/daten/prog/c/lib/convert.hpp"



/////////////// Globale Variablen ///////////////

char debug;


struct rectype
{
string feld_nachname_string;
int feld_nachname_breite;

string feld_vorname_string;
int feld_vorname_breite;

string feld_telefon_string;
int feld_telefon_breite;
}; //rec;


/////////////// Ende Globale Variablen ///////////////


class rec_oop_file_class
{
private:

protected:


int i;

public:
fstream datei;
//protected: geht nicht


struct rectype rec;
struct rectype *recpointer;


void init_rec();

rec_oop_file_class();
~rec_oop_file_class();


void open_file(string para_dateiname_string);

void writerec();
void writerec_nr(int position);

int recsize;

void set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string);

void show_vars();

string dateiname_string;
}; //rec_oop_file_class

void rec_oop_file_class::init_rec()

{
dateiname_string="dummy_file.txt";
set_vars("dummy nachname", "dummy vorname", "dummy 123");
} //init_rec



//----- KONSTRUKTOR ---------------------------------------

rec_oop_file_class::rec_oop_file_class()

{ //OPEN

//init_rec();

debug = 1;

if (debug == 1)
{
cout << "Hier ist Konstruktor rec_oop_file_class" << endl; //debug
}


} //rec_oop_file_class::rec_oop_file_class
//----- KONSTRUKTOR ENDE ---------------------------------------



//----- DESTRUKTOR ---------------------------------------
rec_oop_file_class::~rec_oop_file_class()
{
debug = 0;
if (debug == 1)
{
cout << "hier ist destruktor";
}
datei.close();


} //rec_oop_file_class
//----- DESTRUKTOR ENDE ----------------------------------


void rec_oop_file_class::open_file(string para_dateiname_string)

{
fstream f;


dateiname_string = para_dateiname_string;


f.open(dateiname_string, ios::out);

if (datei) cout << "datei geöffnet"; else cout << "datei nicht geöffnet";

} //rec_oop_file_class::open_file()

//p1
void rec_oop_file_class::writerec()

{
debug = 0;
if (debug == 1)
{
cout << "writerec() dateiname_string=" << dateiname_string << endl; //debug
} //debug
datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
} //rec_oop_file_class::writerec



void rec_oop_file_class::writerec_nr(int position)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist writerec_nr()" << endl; //debug
cout << "Hier ist writerec_nr() recsize=" << recsize << endl; //debug
} //debug

datei.seekp(position*recsize);

writerec();
} //rec_oop_file_class_nr


void rec_oop_file_class::set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist set_vars" << endl; //debug
} //debug

rec.feld_nachname_string = para_feld_nachname_string;
rec.feld_vorname_string = para_feld_vorname_string;
rec.feld_telefon_string = para_feld_telefon_string;

rec.feld_nachname_breite = 20;
rec.feld_vorname_breite = 20;
rec.feld_telefon_breite = 20;
} //set_var


void rec_oop_file_class::show_vars()

{

cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_vorname_breite=" << rec.feld_vorname_breite << endl; //debug

cout << "Hier ist show_vars() rec.feld_telefon_string=" << rec.feld_telefon_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_telefon_breite=" << rec.feld_telefon_breite << endl; //debug
} //show_vars()

////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// main ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////

// schon rec_oop_file_class >25.3.19

int main()

{
rec_oop_file_class f;



//f.set_vars("Zahlhaas", "Manfred", "6972489");

f.open_file("datei.txt");
//f.show_vars();


f.writerec();

cout << endl;
}
</code>
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 10:14:45

Datei wird erstellt aber kein Inhalt hineingeschrieben
Es gibt viele Foren

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: c++ schreibt nicht in datei

Beitrag von eggy » 27.03.2019 12:19:57

@mampfi: hier sinds eckige Klammern, einfach Beitrag editieren (kleiner Stift oben am Kopf es betreffenden Abschnitts) anklicken und < > gegen [ ] tauschen

DeletedUserReAsG

Re: c++ schreibt nicht in datei

Beitrag von DeletedUserReAsG » 27.03.2019 12:21:17

… du gibst dir aber auch echt Mühe, damit möglichst wenige deinen Code lesen möchten, oder? Kann doch nicht so schwer sein, seinen Kram in der Form

[​code]
#include …
[…]
[/code]

zu schreiben? Es sei denn, man will’s tatsächlich nicht. Dann frage ich mich aber schon, was der Thread soll?

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 17:23:07

niemand hat geschrieben: ↑ zum Beitrag ↑
23.02.2019 13:45:52
Was bezweckst du damit, den Code in [deb​] oder in [np]-Tags zu schreiben, statt in Code-Tags, wodurch er tatsächlich lesbar würde?
Ich hab code und /code probiert tut aber nicht
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 17:25:29

mampfi hat geschrieben: ↑ zum Beitrag ↑
27.03.2019 17:23:07
niemand hat geschrieben: ↑ zum Beitrag ↑
23.02.2019 13:45:52
Was bezweckst du damit, den Code in [deb​] oder in [np]-Tags zu schreiben, statt in Code-Tags, wodurch er tatsächlich lesbar würde?
Ich hab code und /code probiert tut aber nicht

Weiterer Test

Code: Alles auswählen

Anfang Code print Ende Code
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 17:28:13

Code: Alles auswählen

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

#include "stdio.h"
#include "string.h"

using namespace std;

//#include "/media/daten/prog/c/lib/pascal.hpp"
//#include "/media/daten/prog/c/lib/convert.hpp"



/////////////// Globale Variablen ///////////////

char debug;


struct rectype 
{
 string feld_nachname_string;
 int feld_nachname_breite;

 string feld_vorname_string;
 int feld_vorname_breite;

 string feld_telefon_string;
 int feld_telefon_breite;
}; //rec;


/////////////// Ende Globale Variablen ///////////////


class rec_oop_file_class
{
    private:

    protected:

    
    int i;

    public:
    fstream datei;
    //protected: geht nicht

    
     struct rectype rec;
     struct rectype *recpointer;


     void init_rec();

     rec_oop_file_class();
      ~rec_oop_file_class();

   
     void open_file(string para_dateiname_string);

     void writerec();
     void writerec_nr(int position);

     int recsize;

     void set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string);

     void show_vars();

     string dateiname_string;
}; //rec_oop_file_class

void rec_oop_file_class::init_rec() 

{
  dateiname_string="dummy_file.txt";
  set_vars("dummy nachname", "dummy vorname", "dummy 123");
 } //init_rec



//----- KONSTRUKTOR ---------------------------------------

rec_oop_file_class::rec_oop_file_class()

{ //OPEN

  //init_rec(); 
                                              
  debug = 1;
  
    if (debug == 1)
  {
    cout << "Hier ist Konstruktor rec_oop_file_class" << endl; //debug
  }


} //rec_oop_file_class::rec_oop_file_class 
//----- KONSTRUKTOR ENDE ---------------------------------------



//----- DESTRUKTOR ---------------------------------------
rec_oop_file_class::~rec_oop_file_class()
{
  debug = 0;
  if (debug == 1)
  {
    cout << "hier ist destruktor";
  }
   datei.close();
 

} //rec_oop_file_class
//----- DESTRUKTOR ENDE ----------------------------------


void rec_oop_file_class::open_file(string para_dateiname_string)

{
  fstream f;
  
  
  dateiname_string = para_dateiname_string;
  
     
  f.open(dateiname_string, ios::out);
  
  if (datei) cout << "datei geöffnet"; else cout << "datei nicht geöffnet";
  
} //rec_oop_file_class::open_file()

//p1
void rec_oop_file_class::writerec()
  
{
  debug = 0;
  if (debug == 1)
  {
  cout << "writerec() dateiname_string=" << dateiname_string << endl; //debug
  } //debug
   datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
   datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
   datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
} //rec_oop_file_class::writerec



void rec_oop_file_class::writerec_nr(int position)

{
  debug = 0;
  if (debug == 1)
  {
  cout << "Hier ist writerec_nr()" << endl; //debug
  cout << "Hier ist writerec_nr() recsize=" << recsize << endl; //debug
  } //debug

  datei.seekp(position*recsize); 

  writerec();
} //rec_oop_file_class_nr


void rec_oop_file_class::set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string)

{
  debug = 0;
  if (debug == 1)
  {
  cout << "Hier ist set_vars" << endl; //debug
  } //debug

  rec.feld_nachname_string = para_feld_nachname_string;
  rec.feld_vorname_string = para_feld_vorname_string;
  rec.feld_telefon_string = para_feld_telefon_string;
  
  rec.feld_nachname_breite = 20;
  rec.feld_vorname_breite = 20;
  rec.feld_telefon_breite = 20;
 } //set_var


void rec_oop_file_class::show_vars()

{
	
 cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug	
 cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
 cout << "Hier ist show_vars() rec.feld_vorname_breite=" << rec.feld_vorname_breite << endl; //debug

 cout << "Hier ist show_vars() rec.feld_telefon_string=" << rec.feld_telefon_string << endl; //debug
 cout << "Hier ist show_vars() rec.feld_telefon_breite=" << rec.feld_telefon_breite << endl; //debug
} //show_vars()

////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// main ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////

// schon rec_oop_file_class >27.3.19
 
int main()

{
  rec_oop_file_class f;
  
  
  
  f.set_vars("Zahlhaas", "Manfred", "6972489");
  f.show_vars();
  
  f.open_file("datei.txt");
  
  
  
  f.writerec();
  
 cout << endl;
}
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 27.03.2019 17:32:22

Button </> verwendet

Hoffe, es ist jetzt besser lesbar


Das Programm erzeugt wie gewünscht eine Datei (z.B. "datei.txt"), die keinen Inhalt hat mit der Größe 0
Es gibt viele Foren

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: c++ schreibt nicht in datei

Beitrag von JTH » 28.03.2019 16:18:56

Ja, so ist das definitiv besser lesbar.

Dein Problem ist allerdings immer noch dasselbe: Du benutzt in deiner Funktion writerec die Klassenvariable datei, den fstream dahinter öffnest du allerdings nie mit einem Dateinamen.

Schritt für Schritt:

In der Funktion writerec benutzt du die Klassenvariable datei, um in eine Datei zu schreiben:

Code: Alles auswählen

class rec_oop_file_class
{
    […]
    
    public:
        fstream datei;
        
    […]
};

void rec_oop_file_class::writerec() 
{
   […]
   datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
   datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
   datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
}


In der Funktion open_file öffnest du allerdings nicht die Datei mit Hilfe der Variable datei, sondern mit einer lokalen Variable f:

Code: Alles auswählen

void rec_oop_file_class::open_file(string para_dateiname_string)
{
  /* Du benutzt diese Variable um die Datei zu öffnen. */
  fstream f; 
  
  dateiname_string = para_dateiname_string;
  f.open(dateiname_string, ios::out);
  
  […]
  
  /* Am Ende der Funktion wird die Variable f wieder „freigegeben“ und die Datei ist
   * nirgendwo geöffnet. */
}


Zum Ausprobieren: Innerhalb der Funktion open_file kannst du mit Hilfe von f in deine Datei schreiben:

Code: Alles auswählen

void rec_oop_file_class::open_file(string para_dateiname_string)
{
  fstream f;
  dateiname_string = para_dateiname_string;
  f.open(dateiname_string, ios::out);
  
  f << "Diese Zeile landet in der Datei.\n";
  datei << "Diese Zeile landet nirgendwo.\n";
}


Damit du die Variable datei zum Schreiben benutzen kannst, musst du die Datei mit der Variablen datei öffnen:

Code: Alles auswählen

void rec_oop_file_class::open_file(string para_dateiname_string)
{
  dateiname_string = para_dateiname_string;
  
  datei.open(dateiname_string, ios::out);
  
  datei << "Jetzt landet diese Zeile in deiner Datei.\n";
}


Hinweis am Rande: Deine Telefonnummer musst du uns nicht verraten ;)

Code: Alles auswählen

int main()
{
  […]
  
  f.set_vars("Zahlhaas", "Manfred", "69XXXXX");
  
  […]
}
Manchmal bekannt als Just (another) Terminal Hacker.

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 29.03.2019 14:49:45

Damm wären das die Änderungen, stimmt?




Code: Alles auswählen

void rec_oop_file_class::open_file(string para_dateiname_string)

{

  fstream datei;
  
  dateiname_string = para_dateiname_string;
  
  datei.open(dateiname_string, ios::out);
  
  datei << "Jetzt landet diese Zeile in deiner Datei.\n";
}
Es gibt viele Foren

Benutzeravatar
king-crash
Beiträge: 722
Registriert: 08.08.2006 12:07:56
Lizenz eigener Beiträge: MIT Lizenz

Re: c++ schreibt nicht in datei

Beitrag von king-crash » 03.04.2019 14:39:05

Kurz gesagt, nein.
So wie es aussieht fehlt dir das grundlegende Verständnis von C++. Ich empfehle dringend mit Basics anzufangen.
Und spar dir doch bitte die ständigen Leerzeilen. Selten habe ich so etwas lästiges gesehen

Code: Alles auswählen

if(datei)
wird immer wahr sein, da der c++ Compiler das Objekt mit irgend etwas != 0 angelegt hat.
Was du meintest ist höchstwahrscheinlich:

Code: Alles auswählen

if(datei.is_open())
In deinem letzten Verbesserungsversuch erzeugst du mit "fstream datei;" ein lokales Objekt, das geöffnet und beschrieben wird.
Beim Verlassen der Funktion wird die Datei wieder geschlossen.
Warum das spätere Beschreiben deiner nicht geöffneten Klassenvariablen "datei" keine Exception wirft, da musst du einen C++ Experten fragen.
Was du meintest wäre dann:

Code: Alles auswählen

void rec_oop_file_class::open_file(string para_dateiname_string)
{
  dateiname_string = para_dateiname_string;
  datei.open(dateiname_string, ios::out);
  datei << "Jetzt landet diese Zeile in deiner Datei.\n";
}
Oder um es möglicherweise deutlicher zu machen:

Code: Alles auswählen

void rec_oop_file_class::open_file(string para_dateiname_string)
{
  dateiname_string = para_dateiname_string;
  this->datei.open(dateiname_string, ios::out);
  this->datei << "Jetzt landet diese Zeile in deiner Datei.\n";
}

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 22.05.2019 10:40:55

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

#include "stdio.h"
#include "string.h"

using namespace std;

//#include "/media/daten/prog/c/lib/pascal.hpp"
//#include "/media/daten/prog/c/lib/convert.hpp"



/////////////// Globale Variablen ///////////////

char debug;


struct rectype
{
string feld_nachname_string;
int feld_nachname_breite;

string feld_vorname_string;
int feld_vorname_breite;

string feld_telefon_string;
int feld_telefon_breite;
}; //rec;


/////////////// Ende Globale Variablen ///////////////


class rec_oop_file_class
{
private:

protected:


int i;

public:
fstream datei;
//protected: geht nicht


struct rectype rec;
struct rectype *recpointer;


void init_rec();

rec_oop_file_class();
~rec_oop_file_class();


void open_file(string para_dateiname_string);

void writerec();
void writerec_nr(int position);

int recsize;

void set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string);

void show_vars();

string dateiname_string;
}; //rec_oop_file_class

void rec_oop_file_class::init_rec()

{
debug = 0;
if (debug == 1)
{
cout << "hier ist destruktor";
}

dateiname_string="dummy_file.txt";
set_vars("dummy nachname", "dummy vorname", "dummy 123");
rec.feld_nachname_breite = 20;
rec.feld_vorname_breite = 20;
rec.feld_telefon_breite = 20;

rec_size = feld_nachname_breite + feld_vorname_breite + feld_telefon_string;
} //init_rec

recsize=20+20

//----- KONSTRUKTOR ---------------------------------------

rec_oop_file_class::rec_oop_file_class()

{ //OPEN

init_rec();

debug = 0;

if (debug == 1)
{
cout << "Hier ist Konstruktor rec_oop_file_class" << endl; //debug
}


} //rec_oop_file_class::rec_oop_file_class
//----- KONSTRUKTOR ENDE ---------------------------------------



//----- DESTRUKTOR ---------------------------------------
rec_oop_file_class::~rec_oop_file_class()
{
debug = 0;
if (debug == 1)
{
cout << "hier ist destruktor";
}
datei.close();


} //rec_oop_file_class
//----- DESTRUKTOR ENDE ----------------------------------


void rec_oop_file_class::open_file(string para_dateiname_string)

{
dateiname_string = para_dateiname_string;

datei.open(dateiname_string, ios::out);


init_rec();
} //rec_oop_file_class::open_file()

//w1
void rec_oop_file_class::writerec()

{debug = 0;
if (debug == 1)
{
cout << "hier ist writerec()";
}

if (datei)
{
datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
}
else
cout << "writerec datei nicht offen" << endl;
} //rec_oop_file_class::writerec



void rec_oop_file_class::writerec_nr(int position)

{
debug = 1;
if (debug == 1)
{
cout << "Hier ist writerec_nr()" << endl; //debug
cout << "Hier ist writerec_nr() recsize=" << recsize << endl; //debug
cout << "Hier ist writerec_nr() position*recsize=" << position*recsize << endl; //debug
} //debug

datei.seekp(position*recsize);



writerec();
} //rec_oop_file_class_nr


void rec_oop_file_class::set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string)

{
debug = 0;
if (debug == 1)
{
cout << "Hier ist set_vars" << endl; //debug
} //debug

rec.feld_nachname_string = para_feld_nachname_string;
rec.feld_vorname_string = para_feld_vorname_string;
rec.feld_telefon_string = para_feld_telefon_string;

rec.feld_nachname_breite = 20;
rec.feld_vorname_breite = 20;
rec.feld_telefon_breite = 20;
} //set_var


void rec_oop_file_class::show_vars()

{

cout << "Hier ist show_vars() rec.feld_nachname_string=" << rec.feld_nachname_string<< endl; //debug
cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_vorname_breite=" << rec.feld_vorname_breite << endl; //debug

cout << "Hier ist show_vars() rec.feld_telefon_string=" << rec.feld_telefon_string << endl; //debug
cout << "Hier ist show_vars() rec.feld_telefon_breite=" << rec.feld_telefon_breite << endl; //debug
} //show_vars()

////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// main ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////

// schon rec_oop_file_class >27.3.19

int main()

{
rec_oop_file_class f;

f.open_file("datei.txt");

f.set_vars("Zahlhaas", "Manfred", "6972489");
f.writerec();

f.set_vars("Kobold", "Raimund", "681430");
f.writerec();

f.set_vars("Müller", "Peter", "333333");
f.writerec();

f.set_vars("Ertl", "Thomas", "3148851");
f.writerec_nr(1);


}
Es gibt viele Foren

mampfi
Beiträge: 1764
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: c++ schreibt nicht in datei

Beitrag von mampfi » 22.05.2019 11:04:04

Alter Fehler gelöst.
Es gibt viele Foren

DeletedUserReAsG

Re: c++ schreibt nicht in datei

Beitrag von DeletedUserReAsG » 22.05.2019 18:01:07

mampfi hat geschrieben: ↑ zum Beitrag ↑
22.05.2019 10:40:55

Code: Alles auswählen

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>

#include "stdio.h"
#include "string.h"

using namespace std;

//#include "/media/daten/prog/c/lib/pascal.hpp"
//#include "/media/daten/prog/c/lib/convert.hpp"



/////////////// Globale Variablen ///////////////

char debug;


struct rectype 
{
 string feld_nachname_string;
 int feld_nachname_breite;

 string feld_vorname_string;
 int feld_vorname_breite;

 string feld_telefon_string;
 int feld_telefon_breite;
}; //rec;


/////////////// Ende Globale Variablen ///////////////


class rec_oop_file_class
{
    private:

    protected:

    
    int i;

    public:
    fstream datei;
    //protected: geht nicht

    
     struct rectype rec;
     struct rectype *recpointer;


     void init_rec();

     rec_oop_file_class();
      ~rec_oop_file_class();

   
     void open_file(string para_dateiname_string);

     void writerec();
     void writerec_nr(int position);

     int recsize;

     void set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string);

     void show_vars();

     string dateiname_string;
}; //rec_oop_file_class

void rec_oop_file_class::init_rec() 

{
  debug = 0;
  if (debug == 1)
  {
    cout << "hier ist destruktor";
  }
  
  dateiname_string="dummy_file.txt";
  set_vars("dummy nachname", "dummy vorname", "dummy 123");
  rec.feld_nachname_breite = 20;
  rec.feld_vorname_breite = 20;
  rec.feld_telefon_breite = 20;
  
  rec_size = feld_nachname_breite + feld_vorname_breite + feld_telefon_string;allerdings
 } //init_rec

recsize=20+20

//----- KONSTRUKTOR ---------------------------------------

rec_oop_file_class::rec_oop_file_class()

{ //OPEN

  init_rec(); 
                                              
  debug = 0;
  
    if (debug == 1)
  {
    cout << "Hier ist Konstruktor rec_oop_file_class" << endl; //debug
  }


} //rec_oop_file_class::rec_oop_file_class 
//----- KONSTRUKTOR ENDE ---------------------------------------



//----- DESTRUKTOR ---------------------------------------
rec_oop_file_class::~rec_oop_file_class()
{
  debug = 0;
  if (debug == 1)
  {
    cout << "hier ist destruktor";
  }
   datei.close();
 

} //rec_oop_file_class
//----- DESTRUKTOR ENDE ----------------------------------


void rec_oop_file_class::open_file(string para_dateiname_string)

{
  dateiname_string = para_dateiname_string;
  
  datei.open(dateiname_string, ios::out);
  
  
  init_rec();
} //rec_oop_file_class::open_file()

//w1
void rec_oop_file_class::writerec()
  
{debug = 0;
  if (debug == 1)
  {
    cout << "hier ist writerec()";
  }
	
  if (datei)
  {
  datei << left << setw(rec.feld_nachname_breite) << rec.feld_nachname_string;
  datei << left << setw(rec.feld_vorname_breite) << rec.feld_vorname_string;
  datei << left << setw(rec.feld_telefon_breite) << rec.feld_telefon_string;
  }
  else 
  cout << "writerec datei nicht offen" << endl; 
} //rec_oop_file_class::writerec



void rec_oop_file_class::writerec_nr(int position)

{
  debug = 1;
  if (debug == 1)
  {
  cout << "Hier ist writerec_nr()" << endl; //debug
  cout << "Hier ist writerec_nr() recsize=" << recsize << endl; //debug
  cout << "Hier ist writerec_nr() position*recsize=" << position*recsize << endl; //debug
  } //debug

   datei.seekp(position*recsize);
   
   
   
  writerec();
} //rec_oop_file_class_nr


void rec_oop_file_class::set_vars(string para_feld_nachname_string, string para_feld_vorname_string, string para_feld_telefon_string)

{
  debug = 0;
  if (debug == 1)
  {
  cout << "Hier ist set_vars" << endl; //debug
  } //debug

  rec.feld_nachname_string = para_feld_nachname_string;
  rec.feld_vorname_string = para_feld_vorname_string;
  rec.feld_telefon_string = para_feld_telefon_string;
  
  rec.feld_nachname_breite = 20;
  rec.feld_vorname_breite = 20;
  rec.feld_telefon_breite = 20;
 } //set_var


void rec_oop_file_class::show_vars()

{
	
 cout << "Hier ist show_vars() rec.feld_nachname_string=" << rec.feld_nachname_string<< endl; //debug	
 cout << "Hier ist show_vars() rec.feld_vorname_string=" << rec.feld_vorname_string << endl; //debug
 cout << "Hier ist show_vars() rec.feld_vorname_breite=" << rec.feld_vorname_breite << endl; //debug

 cout << "Hier ist show_vars() rec.feld_telefon_string=" << rec.feld_telefon_string << endl; //debug
 cout << "Hier ist show_vars() rec.feld_telefon_breite=" << rec.feld_telefon_breite << endl; //debug
} //show_vars()

////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// main ////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////

// schon rec_oop_file_class >27.3.19
 
int main()

{
  rec_oop_file_class f;
  
  f.open_file("datei.txt");
   
  f.set_vars("Zahlhaas", "Manfred", "6972489");
  f.writerec();
  
  f.set_vars("Kobold", "Raimund", "681430");
  f.writerec();
  
  f.set_vars("Müller", "Peter", "333333");
  f.writerec();
  
  f.set_vars("Ertl", "Thomas", "3148851");
  f.writerec_nr(1);
  
  
 }
FTFY. Wobei ich mittlerweile eher glaube, du machst’s mit Absicht. Wobei sich mir allerdings der Zweck nicht erschließt – warum macht man sowas?

Antworten