Filepointer wird gelöscht

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
bowie_22
Beiträge: 20
Registriert: Sa Nov 24, 2012 5:52 am

Filepointer wird gelöscht

Beitrag von bowie_22 » So Apr 27, 2014 5:19 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Filepointer wird gelöscht

Beitrag von cloidnerux » So Apr 27, 2014 6:15 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Filepointer wird gelöscht

Beitrag von mfro » So Apr 27, 2014 6:33 pm

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.]
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

bowie_22
Beiträge: 20
Registriert: Sa Nov 24, 2012 5:52 am

Re: Filepointer wird gelöscht

Beitrag von bowie_22 » Mo Apr 28, 2014 5:44 am

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.

Antworten