FileStreams lesen und schreiben

Die Datensätze (struct) werden in eine Datei geschrieben und daraus ein beliebiger Datensatz zurückgelesen.

  • Im Beispielprogramm werden zwei Buttons verwendet, hinter denen sich das Schreiben bzw. Lesen verbirgt
  • Edit1 beinhaltet die Nummer des zu lesenden Datensatzes
  • Die gelesenen TestDaten werden in einem Memofeld ausgegeben
  • Daten, die in dem Struct ‘Daten’ vom Typ data stehen, werden in eine Datei ‘datafile.dat’ im aktuellen Verzeichnis geschrieben
  • soll die Datei später in einem anderen Zusammenhang geöffnet werden, so muss im TFileStream-Konstruktor statt fmCreate fmOpenRead, fmOpenWrite oder fmOpenReadWrite verwendet werden!!
  • Unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
struct data
{
    char Name[15]; // 15 Zeichen langer Name -> kein (!!!) AnsiString verwenden!!!
    bool bWert;
    DWORD dwWert;
    float fWert;
    int iWert;
};

class TForm1 : public TForm
{
__published: // Von der IDE verwaltete Komponenten

    TButton *Button1;
    TMemo *Memo1;
    TButton *Button2;
    TEdit *Edit1;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);

private: // Anwender-Deklarationen
public:  // Anwender-Deklarationen

    data *Daten; //Zeiger auf eine Datenstruktur
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
  • Unit1.cpp
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float Temp; // temporäre Zwischenvariable für float-Wert
    int i;
    AnsiString Name;

    Daten = new data; // Neues Datenstruktur-Objekt
    TFileStream *Datei = new TFileStream(".datafile.dat", fmCreate);

    // 100 Testwerte schreiben
    for (i=1;i<=100;i++)
    {
        Name = "Testname" + IntToStr(i);   // Namen zusammenbauen
        strcpy(Daten->Name, Name.c_str()); // und nach Daten->Name übergeben

        Daten->bWert = i%2 ? true : false; // bool-Wert übergeben
        Daten->dwWert = i;
        Temp = i;
        Daten->fWert = Temp/2;             // float-Wert übergeben
        Daten->iWert = i;                  // int-Wert übergeben

        Datei->Write(Daten, sizeof(data)); // struct "Daten" in die Datei schreiben
    }

    delete Daten;
    delete Datei;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Daten = new data;
    TFileStream *Datei = new TFileStream(".datafile.dat", fmOpenRead);

    // Datensatzzeiger auf den entsprechenden Datensatz setzen
    // in Edit1 steht die Nummer des zu lesenden Datensatzes
    Datei->Seek(Edit1->Text.ToIntDef(1) * sizeof(data), soFromBeginning);

    // Daten aus der Datei in das struct "Daten" einlesen
    Datei->Read(Daten, sizeof(data));

    // Testdaten ausgeben
    Memo1->Lines->Clear();
    Memo1->Lines->Add(Daten->Name);

    if (Daten->bWert) Memo1->Lines->Add("true");
    else Memo1->Lines->Add("false");

    Memo1->Lines->Add(IntToStr(Daten->dwWert));
    Memo1->Lines->Add(FloatToStr(Daten->fWert));
    Memo1->Lines->Add(IntToStr(Daten->iWert));

    delete Daten;
    delete Datei;
}