edv:prg:c:example:textfile_oeffnen_-_mit_versuchszaehler
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
— : Jürgen Kreick
EOF
edv/prg/c/example/textfile_oeffnen_-_mit_versuchszaehler.txt · Zuletzt geändert: 2020/01/11 01:23 von 127.0.0.1