PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme mit fscanf ;(



pfefferkeks
22-05-2004, 19:00
hi,

ich schreibe mit fprintf in eine datei hinein das geht wunderbar, jetzt möchte ich ganua dise datei mit fscanf wider auslessen zeile für zeile.

datei inhalt:
5
0 test1
1 test2
2 test3
3 test4
4 test5
0 test1
4 test5
3 test4

jetzt versuch ich die erste zeile mit volgender fkt. wider auszulessen:

void read(
int *count
) {
FILE *info1h2;

char *datei = "info1h2.dat";

info1h2 = fopen (datei, "r");

fscanf (info1h2, "%d", count);

fclose (info1h2);

printf("%i", *count);

}


aufruf: read(&count);

ich bekomme immer eine segment failer :(

kann mir jemand einen einschlagenden tip geben?

danke pfefferkeks

wraith
22-05-2004, 19:13
Teste den Rückgabewert von fopen, ist die wahrscheinlichste Fehlerquelle.
Zusätzlich vielleicht auch noch den fscanf Rückgabewert.


....
if((info1h2 = fopen (datei, "r")))
{
if(fscanf(info1h2, "%d", count) == 1)
printf("%i", *count);

fclose (info1h2);
}

pfefferkeks
22-05-2004, 19:49
ne da treten keine fehler aus! sondern erst in dem fscanf :(

danke dir aber trotzdem!!1

grüße pfefferkeks

chrizel
22-05-2004, 20:11
Hallo, ich bins wieder. :D

Ich hab das jetzt mal in einem kleinen Testprogramm ausprobiert:


#include <stdio.h>

void read(int *count)
{
FILE *info1h2;
char *datei = "info1h2.dat";
info1h2 = fopen(datei, "r");
fscanf(info1h2, "%d", count);
fclose(info1h2);
printf("%i", *count);
}

int main(int argc, char *argv[])
{
int count;
printf("start\n");
read(&count);
printf("\nok: %i\n", count);

return 0;
}


Der Fehler tritt tatsächlich auf! Es liegt nicht an diesem Code-Teil, denn er wäre richtig. Bei dem Testprogramm merkt man aber, dass selbst "start" nicht auf stdout ausgegeben wrid, d.h. der Segmentation Fault tritt schon vorher auf. Wenn man sich das ganze im Debugger startet merkt man, dass read vorher schon aufgerufen wird, bevor main überhaupt zum zuge kommt. Ich vermute, dass du mit deiner read-funktion irgendeine glibc-Funktion oder den Linux read-Systemcall überschreibst. Kann da vielleicht jemand anderes noch dazu was sagen?

Du hast zwei Möglichkeiten:
a) Du benennst deine read-Funktion um (my_read, info_read, o.ä.)
b) Du machst deine read-Funktion statisch, stellst also vor "void read(int *count)" ein static. Dann ist die Funktion allerdings nur innerhalb dieses C-files verfügbar.

pfefferkeks
23-05-2004, 10:44
Hi,

danke für den TIP ! jetzt gehts :).

wenn ich jetzt die zweite zeile auslessen möchte, muss ich bei fscanf eine zeilenumbruch machen?
desweiteren versuche ich die werte direct in eine verkettete liste einzulseen:

fscanf (info1h2, "%d %s",current->stelle, current->daten);

jetzt mekert:
info1h2_a.c: In Funktion »read_datei«:
info1h2_a.c:156: Warnung: Format-Argument ist kein Zeiger (Argument 3)

das mit dem read würde mich auch mal genauer interessieren! wenn sich hir bis donnerstag nichts ergibt, frage ich mal mein prof und werde dir dann bericht erstatten!

grüße pfefferkeks