====== Textfile öffnen - mit Versuchszähler ======
Folgende Funktion kann als einfache Vorlage genutzt werden um Textfiles zum Lesen oder Schreiben zu öffnen.
^Parameter ^Beschreibung ^
|%%const FILE ** fileToOpen%% |Adresse der FILE-Variable |
|%%const char * fileNameToOpen%%|FQ Filename, das geöffnet werden soll |
|%%int modus%% |Zum Lesen / zum Schreiben |
|%%int maxRetry%% |Maximale Zahl der Versuche, File zu öffnen |
|%%int retryDelay%% |Pause in Sekunden zwischen den Versuchen |
:!: Alle im Quelltext festkodierte Konstanten sind nur Beispielswerte. Bei konkreter Umsetzung sollen die Werte verwendet werden, die für die jeweilige Anwendung für sinnvoll erscheinen. Noch sinnvoller wäre anstelle von festkodierten Konstanten globale Variablen oder Makros einzusetzen, damit solche Werte auf einfache Weise anwendungsweit angepaßt werden könnten.
int init_EinAusFile (const FILE ** fileToOpen, const char * fileNameToOpen, int modus, int maxRetry, int retryDelay)
{
int rc = RC_OK;
int retry;
// Validierung: Vorhandensein von Variablen (darf kein NULL sein)
if (!fileToOpen) rc = RC_ERROR;
if (!fileNameToOpen) rc = RC_ERROR;
// Validierung: Werte dürfen sich nur im definierten Bereich bewegen
if (!(modus == FILE_READ || modus == FILE_WRITE)) rc = RC_ERROR; // Darf 1 oder 2 sein
if ((maxRetry < 1) || (maxRetry > 32767)) rc = RC_ERROR; // 1 bis 15^2-1 mal
if ((retryDelay < 0) || (retryDelay > 86400)) rc = RC_ERROR; // 24 Std x 60 Min x 60 Sek
// Validierung: Pointer-Variablen: Werte nur im definierten Bereich
if (fileNameToOpen) if (strlen(fileNameToOpen) == 0 || strlen(fileNameToOpen) > FILENAME_LAENGE) rc = RC_ERROR; // Länge des Filenames
if (fileToOpen) if ((*fileToOpen)) rc = RC_ERROR; // File darf nicht bereits geöffnet sein
if (rc) fprintf(stderr, "init_EinAusFile(): Validierungsfehler.\n");
if (!rc) // File öffnen
{
fprintf(stdout, "init_EinAusFile(): File [%s] wird geöffnet...\n", fileNameToOpen);
for (retry = maxRetry; (retry > 0) && (!(*fileToOpen)); retry--) // Evtl. mehrere Versuche
{
if (modus == FILE_READ) *fileToOpen = fopen(fileNameToOpen, "r"); // zum Lesen öffnen
if (modus == FILE_WRITE) *fileToOpen = fopen(fileNameToOpen, "w"); // zum Schreiben öffnen
if ((retry > 1) && !(*fileToOpen)) sleep(retryDelay); // Falls Mißerfolg - kurze Pause einlegen (außer nach dem letzten Versuch).
} // for (retry)
if ((*fileToOpen)) fprintf(stdout, "init_EinAusFile(): ...erfolgreich\n");
else rc = RC_ERROR;
if (rc) fprintf(stderr, "init_EinAusFile(): Fehler beim Öffnen des Files [%s] aufgetreten.\n", fileNameToOpen);
} // if
return rc;
} // init_EinAusFile(..)
wobei:\\
RC_OK und RC_ERROR, FILE_READ und FILE_WRITE, FILENAME_LAENGE sind die vom Benutzer definierten Makros.
Beispiel eines Aufrufs:
#define FILENAME_LAENGE 8191
// TextFile öffnen zum Lesen
#define FILE_READ 1
// TextFile öffnen zum Schreiben
#define FILE_WRITE 2
// Beim Öffnen maximal so viele Versuchen unternehmen:
#define FILE_RETRY 3
// Zwischen den Wiederholungen so viele Sekunden warten:
#define FILE_DELAY 1
FILE * fileInputDatei = NULL; // Input-Datei
FILE * fileOutputDatei = NULL; // Output-Datei
char parFileNameInputDatei [FILENAME_LAENGE + 1]; // FileName für die Input-Datei
char parFileNameOutputDatei [FILENAME_LAENGE + 1]; // FileName für die Output-Datei
int app_Init (void) // Initialisierung für die gesamte Anwendung
{
int rc = RC_OK;
fprintf(stdout, "app_Init(): Ein-/Ausgabe-Files werden geöffnet/erstellt.\n");
// Die Input-Datei zum Lesen öffnen
if (rc == RC_OK) rc = init_EinAusFile(&fileInputDatei, parFileNameInputDatei, FILE_READ, FILE_RETRY, FILE_DELAY);
// Die Output-Datei zum Schreiben öffnen
if (rc == RC_OK) rc = init_EinAusFile(&fileOutputDatei, parFileNameOutputDatei, FILE_WRITE, FILE_RETRY, FILE_DELAY);
if (rc == RC_OK) fprintf(stdout, "app_Init(): Alle Ein-/Ausgabe-Files wurden erfolgreich geöffnet/erstellt.\n");
else fprintf(stdout, "app_Init(): ERROR: Das öffnen/erstellen von Ein-/Ausgabe-Files war nicht erfolgreich.\n");
return rc;
} // app_Init()
Und ab und zu **fflush(stderr);** bzw. **fflush(stdout);** auch nicht vergessen.
----
Stand: 24.02.2010\\
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF