c++ schreibt nicht in datei

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mampfi
Beiträge: 1765
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: 1765
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: 1765
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: 1765
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