Benötige Hilfe bei einer Funktion zum Einlesen einer Datei
Verfasst: So Dez 04, 2011 3:20 am
Hallo liebe Community,
ich hätte da ein kleines Problemchen und würde mich über eure Hilfe
sehr freuen.
Ich versuche gerade eine Funktion zu schreiben, die eine Textdatei zum zeilenweisen Lesen öffnet und den Inhalt der Datei dann mittels strcat zeilenweise in einen zuvor reservertien Speicherbereich anhängt.
Ziel ist es dann, sich den Inhalt aus dem Speicherbereich über die Standardausgabe ausgeben zu lassen.
Doch leider bin ich bisher nicht wirklich erfolgreich mit diesem Versuch. Dummerweise komme ich auch nicht darauf, woran es letztendlich hakt.
Daher würde ich mich sehr über eure Hilfe freuen. Hier erstmal der Quellcode:
Ich würde mich sehr über Hilfe von euch freuen. 
Gruß
DAV3
ich hätte da ein kleines Problemchen und würde mich über eure Hilfe
sehr freuen.
Ich versuche gerade eine Funktion zu schreiben, die eine Textdatei zum zeilenweisen Lesen öffnet und den Inhalt der Datei dann mittels strcat zeilenweise in einen zuvor reservertien Speicherbereich anhängt.
Ziel ist es dann, sich den Inhalt aus dem Speicherbereich über die Standardausgabe ausgeben zu lassen.
Doch leider bin ich bisher nicht wirklich erfolgreich mit diesem Versuch. Dummerweise komme ich auch nicht darauf, woran es letztendlich hakt.
Daher würde ich mich sehr über eure Hilfe freuen. Hier erstmal der Quellcode:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ZEILE 255
#define BLOCK 10
enum { ERFOLG, FEHLER };
/* ***vektor == zeigt auf einen Zeiger einer Zeile mit einem Zeiger auf die Länge der Zeile
* dateiname == Name der zu öffnenden Datei
* *zeile_n == Zeiger auf Anzahl der Zeilen
* Rückgabewert: ERFOLG wenn kein Fehler, FEHLER wenn Fehler
*/
int datei_lesen(char ***vektor, char *dateiname, int *zeile_n)
{
char puffer[ZEILE] = { 0 }; /* Puffer der zeilenweise einliest */
char ***vektor_zeiger; /* zum vergrößern des Speichers für vektor */
char *zeiger; /* zum vergrößern des Speichers für die Anzahl der Zeichen in einer Zeile */
char *neuezeile = NULL; /* Zeiger für neue Zeile */
FILE *datei; /* Datei zum Öffnen */
int fehler = ERFOLG; /* Fehlerstatus */
int zeile = 0; /* altuelle Zeile */
int alt_zeile_n; /* Anzahl der Zeilen für die neuer Speicherplatz reserviert werden soll */
int absatz_n;
*zeile_n = 0;
if(BLOCK > 0 && ZEILE > 0)
{ /* Speicher für 10 Zeilen reservieren */
vektor = malloc(BLOCK * sizeof(***vektor));
if(NULL != vektor)
{ /* für jede Zeile jeweils Platz für 255 Bytes reservieren */
for(zeile = 0; zeile < BLOCK; zeile++)
{
vektor[zeile] = malloc(ZEILE * sizeof(*vektor[zeile]));
if(NULL == vektor[zeile])
fehler = FEHLER;
else
vektor[zeile][0] = '\0';
}
}
if(FEHLER == fehler) /* Bei Fehler, Speicher wieder freigeben */
{
if(vektor != NULL)
{
for(zeile = 0; zeile < BLOCK; zeile++)
{
if(vektor[zeile] != NULL)
free(vektor[zeile]);
}
}
free(vektor);
vektor = NULL;
}
}
if(NULL != vektor)
{
datei = fopen(dateiname, "r");
if(NULL != datei)
{
*zeile_n = BLOCK;
absatz_n = 0;
/* solange kein Fehler, zeilenweise einlesen */
while(ERFOLG == fehler && NULL != fgets(puffer, ZEILE, datei))
{
neuezeile = strchr(puffer, '\n');
/* Newline gegen Terminierungszeichen austauschen */
if(NULL != neuezeile)
*neuezeile = '\0';
strcat((*vektor)[zeile], puffer);
if(NULL != neuezeile)
{
absatz_n = 1;
zeile++;
/* Falls kein Platz mehr für Zeilen im Speicher, zusätzlich reservieren */
if(zeile >= *zeile_n)
{
alt_zeile_n = *zeile_n;
/* Bei negativem Wert, Zeilen entfernen */
if(BLOCK < 0)
{
for(zeile = alt_zeile_n-1; zeile >= alt_zeile_n + BLOCK; zeile--)
free((vektor)[zeile]);
}
/* Speicher für einzelne Zeilen reservieren */
vektor_zeiger = realloc(vektor, (alt_zeile_n + BLOCK)*sizeof(***vektor));
if(NULL != vektor_zeiger)
{
vektor = vektor_zeiger;
for(zeile = alt_zeile_n; zeile < alt_zeile_n + BLOCK; zeile++)
{ /* Speicher für Anzahl der Zeichen, die jede Zeile aufnehmen kann */
(*vektor)[zeile] = malloc(ZEILE);
if(NULL != (vektor)[zeile])
(vektor)[zeile][0] = '\0';
else
fehler = FEHLER;
}
*zeile_n += BLOCK;
}
else
fehler = FEHLER;
}
}
else
{ /* Falls kein Newline, dann ist die Zeile länger als 255 Bytes */
absatz_n = 2;
/* Mehr Speicher für Anzahl der Zeichen in der Zeile reservieren */
zeiger = realloc(vektor[zeile], absatz_n * ZEILE);
if(zeiger != NULL)
vektor[zeile] = zeiger;
else
fehler = FEHLER;
}
}
fclose(datei);
}
else
fehler = FEHLER; /* Falls Datei nicht geöffnet werden kann bzw. nicht existiert */
}
else
fehler = FEHLER; /* Falls Speicherallokation fehlschlägt */
return(fehler);
}

Gruß
DAV3