Benutzer-Werkzeuge

Webseiten-Werkzeuge


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 * fileNameToOpenFQ 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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki