C++ Kurs

Wenn fertig, bitte Fenster schließen

Lösung zur Lektion "Dateizugriffe"


// Lösung zum Dateihandling mittels Streams
// Dateien einbinden

#include <iostream>
#include <fstream>
using namespace std;

// Dateiname
const char* const pszDATEI = "kunden.bin";

// main() Funktion
int main()
{
   // Definition der Kundendaten mit Initialisierung
   short nKdNummer = 33;
   float fUmsatz = 12.3f;
   short nTag=1, nMonat=3, nJahr=2008;

   // Eingabestream-Objekt definieren und mittels open() mit der Datei verbinden.
   fstream ioFile;
   ioFile.open(pszDATEI,ios::out|ios::in|ios::binary|ios::trunc);
   // Fehler abfangen!
   if (!ioFile)
   {
      cout << "Fehler beim Öffnen der Datei!\n";
      exit(1);
   }
   // Daten in Datei übertragen
   ioFile.write(reinterpret_cast<char*>(&nKdNummer),sizeof(nKdNummer));
   ioFile.write(reinterpret_cast<char*>(&fUmsatz),sizeof(fUmsatz));
   ioFile.write(reinterpret_cast<char*>(&nTag),sizeof(nTag));
   ioFile.write(reinterpret_cast<char*>(&nMonat),sizeof(nMonat));
   ioFile.write(reinterpret_cast<char*>(&nJahr),sizeof(nJahr));

   // Daten aus Datei auslesen
   ioFile.seekg(static_cast<ios::off_type>(0),ios::beg);
   ioFile.read(reinterpret_cast<char*>(&nKdNummer),sizeof(nKdNummer));
   ioFile.read(reinterpret_cast<char*>(&fUmsatz),sizeof(fUmsatz));
   ioFile.read(reinterpret_cast<char*>(&nTag),sizeof(nTag));
   ioFile.read(reinterpret_cast<char*>(&nMonat),sizeof(nMonat));
   ioFile.read(reinterpret_cast<char*>(&nJahr),sizeof(nJahr));

   // Eingelesene Daten ausgeben
   cout << "Kundendaten:\n------------\n";
   cout << "KD-Nummer : " << nKdNummer << endl;
   cout << "Umsatz in TSD : " << fUmsatz << endl;
   cout << "Letzter Umsatz am: ";
   cout << nTag << "." << nMonat << "." << nJahr << endl;

   // und jetzt Umsatz um 5 Tsd erhöhen
   fUmsatz += 5.0f;

   // und wieder in Datei zurückschreiben
   // Dateizeiger entsprechend positionieren
   // Der Umsatz liegt als 2. Datum in der Datei und damit
   // um nKdNummer hinter dem Dateianfang

   ioFile.seekp(static_cast<ios::off_type>(sizeof(nKdNummer)),ios::beg);
   ioFile.write(reinterpret_cast<char*>(&fUmsatz),sizeof(fUmsatz));

   // Nun Datensatz erneut auslesen
   // ACHTUNG! Dateizeiger für Leseoperationen muss
   // natürlich auf Dateianfang positioniert werden

   ioFile.seekg(static_cast<ios::off_type>(0),ios::beg);
   // Daten aus Datei auslesen
   ioFile.read(reinterpret_cast<char*>(&nKdNummer),sizeof(nKdNummer));
   ioFile.read(reinterpret_cast<char*>(&fUmsatz),sizeof(fUmsatz));
   ioFile.read(reinterpret_cast<char*>(&nTag),sizeof(nTag));
   ioFile.read(reinterpret_cast<char*>(&nMonat),sizeof(nMonat));
   ioFile.read(reinterpret_cast<char*>(&nJahr),sizeof(nJahr));

   // Datei schliessen
   ioFile.close();

   // Eingelesene Daten formatiert auf Bildschirm ausgeben
   cout << "Kundendaten:\n------------\n";
   cout << "KD-Nummer : " << nKdNummer << endl;
   cout << "Umsatz in TSD : " << fUmsatz << endl;
   cout << "Letzter Umsatz am: ";
   cout << nTag << "." << nMonat << "." << nJahr << endl;
}