PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei Zeilenweise einlesen mit dynamischer Buffergröße



jeroen
22.05.2008, 11:53
hi,

ich möchte gern ein Datei einlesen mit hilfe ein c Programms.
Die einzulesende Datei ist eine Textdatei und ist Zeilenweise aufgebaut.

Hier ist mein anfang:


int dateieinlesen(const char* dateiname, const list_t *l)
{
FILE* datei;
int zeilenlaenge;
char* zeilen_puffer;
int ergebnis;

datei = fopen(dateiname, "r");

if ( datei == NULL )
{
ergebnis = FALSE;
}
else
{
while( !feof(datei) )
{
zeilenlaenge = Zeilenlaenge(datei);

zeilen_puffer = (char*) malloc( (zeilenlaenge+1) * sizeof(char) );

fgets(zeilen_puffer, zeilenlaenge+1, datei);

free(zeilen_puffer);

}

fclose(datei);
ergebnis = TRUE;
}

return ergebnis;
}

int Zeilenlaenge(FILE* datei)
{
int i;
char zeichen;
fpos_t alt_pos;

fgetpos( datei, &alt_pos ); // Aktuelle Position merken.


i=0;
while ( ( zeichen = fgetc(datei) ) != '\n' && feof(datei) == FALSE )
{
i++;
}

fsetpos( datei, &alt_pos ); // Zurück auf gemerkte Position.
return (i+1);
}


Das Prinzip sollte klar sein. Ich lesen solang zeichen ein bis ein \n auftaucht. Zuvor sicher ich aber die Position innerhalb der Datei.
Dann reserviere ich mir den erfoderlichen Speicher und lesen die Zeile ein.

In der ersten Zeile klappt alles wunderbar, aber dann klapps nicht mehr. Das Problem ist, glaub ich , das das sichern der Dateipostion nicht geht.

Kann mir mal jemand ne kurzen Tipp geben ?

lorcan
22.05.2008, 12:49
Du solltest evtl. die letzte Position wieder einlesen und an die Aufrufende Funktion zurückgeben und den FILE-Pointer neu mit fsetpos positionieren.
Sieht so aus, als wenn der FILE-Pointer den Wert aus der Funktion nicht übernimmt. Oder nen Pointer auf den FILE-Pointer übergeben.

fluchtpunkt
22.05.2008, 12:55
ich hab vor das free(zeilen_puffer) mal ne Ausgabe gebastelt und das gibt bei mir wunderbar die einzelnen Zeilen aus.
Was funktioniert denn nicht?

PicNick
22.05.2008, 15:24
..dann klapps nicht mehr..
Was passiert denn ?

jeroen
22.05.2008, 20:08
der fehler liegt dadrin das die postion nicht richtig zurück gesetzt wird. die zweiten zeile ist das letzte zeiche der ersten usw. es ende in einer endlos schleife.

es liegt, glaub ich, daran das in den datei der zeilenumbruch durch ein 0A dargestellt wird. bei windows editor wird der zeilen umbruch aber durch ein 0D0A dargestellt.