3.10.3 Daten lesen

Ist der Dateizeiger für den Datensatz gefunden, so kann der Datensatz gelesen oder beschrieben werden. Dazu dienen die Funktionen LibFileRead, LibFileReadEx und LibFileWrite.

LibFileWrite(&fb,&fi);

Hier wird der durch fb und fi bezeichnete Datensatz neu beschrieben. Will man einen neuen Datensatz schreiben/anlegen, so kann man natürlich nicht vorher nach ihm suchen. Dann ist zum Schreiben fi.fp auf den Wert 0xffff (oder -1) zu setzen.
Übrigens ändert sich auch beim Beschreiben eines schon vorhandenen Datensatzes der Dateizeiger. fi.fp wird natürlich angepaßt. Hat man sich jedoch eine Liste von Dateizeiger von bestimmten Datensätzen gemerkt, damit man später schneller zugreifen kann, ohne sich noch mal durch die ganze Reihe zu hangeln, so muß man diese Liste anpassen. Beim Schreiben eines neuen Rekords ist die Situation noch schlimmer: alle Dateizeiger können sich ändern. Dies gilt sogar für Rekords anderer Submodi.

Analog funktioniert das Lesen. Eine Vorgabe von 0xffff für den Dateizeiger hat hier keinen Sinn.

LibFileRead(&fb,&fi);

Ein anderes Problem tritt beim Lesen unbekannter binärer Datensätze auf. Wenn es sich um einen großen, mittels LFILE_BUF angelegten Datensatz handelt, würde das Einlesen in einen FILE_BUF natürlich den Speicherbereich überschreiten. Die Funktion LibFileReadEx erlaubt deshalb die Festlegung der Größe der einzulesenden Daten. Maßeinheit hier ist FILE_BLOCK_SIZE, in define.h zur Zeit auf 64 Byte festgelegt.

LibFileReadEx(&fb,&finf,3*1024/FILE_BLOCK_SIZE);

Das Beispiel liest nicht mehr Daten ein, als im Dateipuffer FILE_BUF Platz finden.

/******************************************************************/
/* Programm um den Zugriff auf den FLASH-Speicher zu zeigen       */
/******************************************************************/

#include	
#include	"define.h"
#include	"libc.h"

void main()
{
  FILE_BUF fb;			/* Dieses struct nimmt alle Daten auf */
  char filename[20];		/* Dateiname */
  FILE_INFO fi;			/* Vergleichbar einem Filehandle */
  word fhandle;				
  word errcode;

  memset(&fb,0,sizeof(fb));		/* Zuerst den Datenbereich initialisieren */
  strcpy(filename,"Testdaten");	/* Und den Dateinamen zuordnen */
                                /* wir wollen eine Datei zum lesen öffnen */
  if (! LibSubEntrySearch(filename,&(fb.fsb_sub_entry_)))
                                  /* in sb.fsb_sub_entry steht die Nummer des Files */
    LibPutMsgDlg("Dateifehler 1");	/* Fehlerbehandlung ist hier nur angedeutet */

	/* jetzt noch die Modusnummer für den Main-Modus lesen */
  if(!LibGetAllEntry(filename,&(fb.fsb_main_entry_),&(fb.fsb_sub_entry_)))
    LibPutMsgDlg("Dateifehler 2");  /* Fehlerbehandlung ist hier nur angedeutet */
  fb.fsb_scrt_info_=FILE_OPEN_MODE; /* nicht im Geheimen Bereich arbeiten */

  fi.fp      = 0xffff;	    	  /* Am Dateianfang beginnen */
  fi.kind    = FILE_KIND_BIN;     /* ADDINs dürfen nur Binärdaten */
  fhandle=LibFileFindNext(&fb,&fi,0x00);    /* Suchen nach Datensatz */
			/* in fhandle steht, ob was gefunden wurde, oder nicht */
  errcode=FlashStatus;  /* FlashStatus ist eine globale Variable des PVOS */
  while (fhandle)       /* Solange lesen, wie was da ist */
  {
    LibFileRead(&fb,&fi);		/* Hier wird ein Datensatz gelesen */
    LibPutMsgDlg(fb.fbuf.bin.bin_buf);	 /* und angezeigt */
    fhandle=LibFileFindNext(&fb,&fi,0x00);    /* Nächsten Datensatz holen */
  }
  LibJumpMenu();
}

Für Ergänzungen wenden Sie sich bitte an: Jürgen Wagner