Binär struct tm schreiben und lesen?!

Metzlmane

Mitglied
Hy Leute, ich hoffe ihr könnt mir weiterhelfen ;)

Ich habe vieles ausprobiert um einen Wert mit einem Zeitstempel binär abzuspeichern und dann wieder auszulesen.
Das ganze geht auch so lange gut, wie das Programm geöffnet bleibt. Bei erneutem Ausführen und Auslesen kommen für die Zeit etwas komische -23423524-Werte raus und ich finde den Grund dafür nicht.

Ich lass den Wert eingeben und dann mit der aktuellen Zeit abspeichern und unter einem anderen Menuepunkt ruf ich dich Ausgabe auf.
Ich vermute dass es was mit
C:
time_t sec;
time(&sec);
zu tun hat?

C:
struct mess
{
	struct tm *zeit;
	double wert;
}x;

void eingeben()
{
	FILE *dtptr;
	dtptr = fopen(datei,"ab");
	if (dtptr == NULL)
	{
		printf("Datei konnte nicht zum Schreiben "
			   "geoeffnet werden!\n"); exit(-1);
	}
	do{
		x.wert=0;
		printf("- Wert%2d --> ",anzahl);
		fflush(stdin);
		if(scanf("%lf",&x.wert)==-1)
			break;
		if(x.wert <= 0 || x.wert >=1000)
			continue;
		else
		{
			anzahl++;
			time_t sec;
			time(&sec);
			x.zeit=localtime(&sec);
			fwrite(&x, sizeof (x), 1, dtptr);	
			printf("%d",x.zeit->tm_sec);
		}
	}while(1);
	fclose(dtptr);
}
void auslesen()
{
	FILE *dtptr;
	dtptr = fopen(datei,"rb");
	if (dtptr == NULL)
	{
		printf("Datei konnte nicht zum Schreiben "
			   "geoeffnet werden!\n"); exit(-1);
	}
	else
	{
		printf("\n\nInhalt von Datei <mess.dat>:"
			   "\n=============================="
			   "\n\n   Wert  |    Datum   | Std | Min | Sek  "
			     "\n-----------------------------------------");
		while(!feof(dtptr))
		{
			fread(&x, sizeof (x), 1, dtptr);
			printf("\n %3.3lf | %d",x.wert,x.zeit->tm_min);
		}
	}
	fclose(dtptr);
}
 
Hi.

Was du dort machst ist natürlich Unsinn. Du speicherst den Zeiger (also die Adresse) auf eine tm Struktur ab. Dieser Zeiger zeigt beim Neustart deines Programmes dann natürlich irgendwo hin - nur nicht auf eine gültige tm Struktur.

Warum speicherst du die Zeit nicht einfach als time_t ? Dort die lokale Zeit abzuspeichern ist sowieso fragwürdig.

Gruß
 
Hy,

Ok. Vielen Dank!
Das macht das ganze schon mal um einiges verständlicher. Einen Zeiger abzuspeichern ist natürlich völliger Blödsinn. Hatte zwar nach den Funktionen gegoogelt aber irgendwie keine für mich brauchbaren Informationen erhalten.

Leider steh ich dann wohl total auf dem Schlauch.
Und in meiner Aufgabe steht ich muss time() und localtime() verwenden?!
Code:
 time_t time(time_t *tp)
Ich weis dass time() die aktuelle Zeit dann in time_t speichert aber wie könnte ich das dann in die Struktur (is so vorgegeben ...) speichern?
Hab den blöden Zeiger rausgenommen ;)
C:
struct mess
{
	struct tm zeit;
	double wert;
}x;


wäre sehr dankbar wenn du mir helfen könntest!
mfg Alex
 
Hi.

Dann poste mal besser genau die Aufgabe. Grundlegend hat die Datenhaltung nichts mit der Präsentation zu tun. D.h. wie du's speicherst ist doch ohne Belang, wenn du dann bei der Ausgabe die Lokalzeit ausgibst.

Gruß
 
Ok:

Aufgabenstallung: "Messwerte in Binär-Datei ablegen"

Es ist eine globale Struktur aus 2 Komponenten zu vereinbaren:

-1. Komponente: Struktur tm (aus <time.h>)
-2. Komponente: double wert (->Messwert: 0 < wert <1000)

Die Messwerte sind mit einer seperaten Funktion einzulesen und zusammen mit der akt. "Uhrzeit" (s. die in VL. behandelten Funktionen time()/localtime()) in eine binäre Datei abzuspeichern. Die Zahl der Sätze ist an main() zurückzugeben.

In einer zweiten Funktion ist der Datenbestand satzweise einzulesen und tabellarisch auszugeben. Hierbei soll neben dem Zeitpunkt der Abspeicherung auch das aktuelle Datum ergänzt werden


...

Gut, der letzte Satz ist etwas ..hmm komisch? Da dachte ich einfach das abgespeicherte Datum mit auszugeben aber das ist ja nicht so wichtig.

Die Werte müssen so lange eingelesen werden bis man Strg+z drückt deswegen auch
Code:
if(scanf("%lf",&x.wert)==-1)

und ich habe hier die 2 Funktionen gepostet die halt dann über ein switch/case Menü aufgerufen werden, keine große Sache.
 
Ok:

Aufgabenstallung: "Messwerte in Binär-Datei ablegen"

Es ist eine globale Struktur aus 2 Komponenten zu vereinbaren:

-1. Komponente: Struktur tm (aus <time.h>)
-2. Komponente: double wert (->Messwert: 0 < wert <1000)
Aha. Das ist also so vorgegeben.

Dann mußt du den Wert den localtime berechnet mit memcpy in deine Struktur übernehmen. Außerdem wäre grundsätzlich Fehlerabfrage nicht verkehrt.

Gruß
 
ok ich denke ich habs rausgefunden:

Code:
struct mess
{
	struct tm zeit;
	double wert;
}x;

Code:
			time_t t;
			time(&t);
			x.zeit=*localtime(&t);
so speichere ich ganz einfach die komplette Zeit in die Struktur. Und das Problem, dass localtime() einen Zeiger zurückgibt hab ich jetz auch eingesehehn^^

Vielen Dank für die Hilfe
 
Code:
			time_t t;
			time(&t);
			x.zeit=*localtime(&t);
so speichere ich ganz einfach die komplette Zeit in die Struktur.
Stimmt, das kommt natürlich auf's gleiche raus. Wie gesagt solltest du evlt. vorher den Wert prüfen den localtime zurückgibt das der nicht NULL ist.

Gruß

PS: Markiere doch dann bitte noch das Thema als erledigt.
 
Zurück