Seite 1 von 1

Filepointer wird gelöscht

Verfasst: So Apr 27, 2014 5:19 pm
von bowie_22
Hallo Zusammen,

ich wollte im Rahmen eine C-Einführung ein Bespiel für den wahlfreien Zugriff mit fseek schreiben.
Hier der Code:

Code: Alles auswählen

#include <stdio.h>

#define OFFSET_HB_BLOCK 64L

int main()
{
	FILE *fp;
	
	char meas_time[8];
	fp = fopen("CANape.MDF","r");

	fseek(fp,OFFSET_HB_BLOCK,SEEK_SET); //set seek pointer to start of HD-Block
	fseek(fp,28,SEEK_CUR); //set seek pointer to start of time data range
	fscanf(fp,"%s",meas_time);


	printf("Time: %s",meas_time);
	return 1;
}

Mein Problem:
Wenn ich das Programm mit einem Debugger durchsteppe dann wird beim Aufruf von fscanf der File-Pointer fp auf NULL gesetzt.
meas_time wird richtig beschrieben. Das alles tut, bloss der fp ist weg und eigentlich will ich mit dem in der Folge weiterarbeiten.
Ich habe das alles jetzt mit fread implementiert, da funktioniert es, verstehe aber immer noch nicht. warum fscanf den File-Pointer modifiziert?!
Hat jemand eine Idee?

Danke!

Gruß

Marcus

Re: Filepointer wird gelöscht

Verfasst: So Apr 27, 2014 6:15 pm
von cloidnerux
Ich habe das alles jetzt mit fread implementiert, da funktioniert es, verstehe aber immer noch nicht. warum fscanf den File-Pointer modifiziert?!
Woher weißt du, dass fp NULL ist?
fscanf kann den Pointer nicht modifizieren, denn beim Aufruf wird der Inhalt des Pointers kopiert und mit der Kopie Arbeitet dann die Funktion. Bist du dir sicher, dass fp nicht vorher schon NULL war? Denn das ist der default Rückgabewert von fopen, wenn es einen Fehler gibt.

Re: Filepointer wird gelöscht

Verfasst: So Apr 27, 2014 6:33 pm
von mfro
bowie_22 hat geschrieben:... verstehe aber immer noch nicht. warum fscanf den File-Pointer modifiziert?!
Hat jemand eine Idee?

Danke!

Gruß

Marcus
Da kann man nur raten (weil man deine Datumsdefinition nicht kennt), aber ich gehe mal stark davon aus, daß die nicht aus 7 Bytes besteht (sondern möglicherweise aus 8). Dann ist da kein Platz mehr fürs Stringendezeichen.

Oder Du hast nach dem String kein Leerzeichen oder Nullbyte im File. Dann liest fscanf() fleißig Zeichen ein, bis irgendwann mal eins auftaucht, weil Du die Länge des Formatstrings nicht begrenzt hast.

Code: Alles auswählen

int main()
{
	FILE *fp;
	
	char meas_time[8 + 1];             // wenn der Timestring 8 Zeichen lang ist, dann muß da noch Platz für's Nullbyte sein
	fp = fopen("CANape.MDF","r");

	fseek(fp,OFFSET_HB_BLOCK,SEEK_SET); //set seek pointer to start of HD-Block
	fseek(fp,28,SEEK_CUR); //set seek pointer to start of time data range
	fscanf(fp,"%8s",meas_time);

	printf("Time: %s",meas_time);
	return 1;
}
Egal ob eins oder zwei oder beides: der fscanf() Aufruf schreibt mit großer Wahrscheinlichkeit über die Feldgrenzen hinaus, was zu allerhand seltsamem Verhalten führen kann.

[edit: Auch der Hinweis von Cloidnerux ist nicht schlecht: Standard-Library Funktionen (wie fopen()) können auch mal fehlschlagen (z.B. wenn die Datei nicht existiert, die fopen() öffnen soll). Wenn man die Returnwerte nicht abfagt, geht einem das durch die Lappen und die anschließenden Befehle schief.]

Re: Filepointer wird gelöscht

Verfasst: Mo Apr 28, 2014 5:44 am
von bowie_22
Hallo,

Danke für die Antworten!
@mrfo: Genau das Problem das Du beschreibst war es auch.
Wenn ich die Feldbreite angeben funktioniert, d.h. wie Du beschreiben hast, dass scanf einfach über die time_meas Grenzen hinauschreibt und irgandwann fp erwischt.
Danke für die Hilfe.