Fufialk Geschrieben 6. Juli 2005 Geschrieben 6. Juli 2005 Ich möchte gerne das Datum aus einem Hexstream auslesen, und dieses dann anzeigen lassen bzw. später als Dateinamen für den Stream verwenden. Der Stream beginnt so: 02 00 20 00 71 1c c7 42 00 00 00 00 00 00 00 00 ......... Der unterstrichene Teil bezeichnet dabei Datum und Uhrzeit, die ich anzeigen, bzw. später verwenden möchte. Mein Code sieht derzeit so aus: struct tm *tblock; ifl.seekg(2*sizeof(short), ios::beg); ifl.read((char*)&tblock, [U]sizeof(int)[/U]); cout << tblock; bis hier läuft alles richtig, und die korrekte Hexfolge wird angezeigt. (71 1c c7 42) Weiter geht es dann so: printf("%02d%02d%04d",tblock->tm_mday,tblock->tm_mon+1,tblock->tm_year+1900); Es lässt sich auch alles ohne Probleme compilieren, jedoch stürzt das Programm beim ausführen ab. Windows Fehler: Die Anweisung "read" konnte nicht ausgeführt werden! Verändere ich den oberen Code wie folgt (unterstrichene Stelle): struct tm *tblock; ifl.seekg(2*sizeof(short), ios::beg); ifl.read((char*)&tblock, [U]sizeof(short)[/U]); cout << tblock; läuft das Programm durch, aber beim Datum wird murks angezeigt. Der Dateiname (42C86DF0.dat) enthält auch das Datum, und wird vom Benutzer eingegeben: char fileread[13] cout << "\n\nGeben Sie den Dateinamen der zu bearbeitenden Datei ein: "; cin.getline(fileread, 13); Vielleicht besteht ja auch die Möglichkeit darauf zuzugreifen. Zitieren
nic_power Geschrieben 6. Juli 2005 Geschrieben 6. Juli 2005 Hallo, struct tm *tblock; ifl.seekg(2*sizeof(short), ios::beg); ifl.read((char*)&tblock, sizeof(int)); cout << tblock; Hast Du auch irgendwo den Speicher allociert, auf den der Pointer *tblock verweist? Nic Zitieren
Fufialk Geschrieben 6. Juli 2005 Autor Geschrieben 6. Juli 2005 Ehrlich gesagt weiß ich das nicht. Ich hab mich völlig auf folgendes Beispiel bezogen: Thread vom 29.04.2004 Und da wurde es ähnlich gemacht. Du meinst ich muss noch die Funktion time_t noch hinzufügen? Zitieren
Fufialk Geschrieben 6. Juli 2005 Autor Geschrieben 6. Juli 2005 Der Speicher wird doch über die #include <time.h> allociert, oder täusche ich mich da? Ich meine sonst würde das Problem ja auch beim anderen Fall, wo nur von der länge short einlese, auch ein Fehler entstehen. Zitieren
nic_power Geschrieben 6. Juli 2005 Geschrieben 6. Juli 2005 Hallo, Wenn Du Pointer auf Strukturen verwendest, muss der Speicher auf den dieser Pointer verweist irgendwann mal allokiert werden: tblock=(struct tm *)malloc(sizeof(struct tm)); ifl.read((char*)&tblock, sizeof(int)); cout << tblock; weist "tblock" ein int zu. Allerdings ist tblock ein Pointer, der dann entsprechend auf irgendwelche ungültigen Speicherstellen zeigt, auf die Du im weiteren Verlauf lesend zugreifst. Das führt dann zum Absturz. Nachtrag: Das von Dir zitierte Beispiel in dem verlinkten Thread funktioniert, da "localtime" einen Pointer auf eine Struktur zurück liefert, für die in der Funktion "localtime()" entsprechend Speicher allokiert wurde. Nic Zitieren
Fufialk Geschrieben 6. Juli 2005 Autor Geschrieben 6. Juli 2005 Genau, vielen Dank für die Hilfe, es sieht jetzt so aus, und funktioniert hervorragend. long zeit; ifl.seekg(2*sizeof(short), ios::beg); ifl.read((char*)&zeit, sizeof(int)); time_t timer; struct tm *tblock; tblock = localtime(&zeit); sprintf(filewrite,"%02d%02d%04d.txt",tblock->tm_mday,tblock->tm_mon+1,tblock->tm_year+1900); cout << "\nDateiname : " << filewrite; Ich war vorher nur immer davon ausgegangen, das localtime nur das aktuelle Datum anzeigt, was mich etwas verwirrt hat. Schönen abend noch. Ich kann fürs erste einmal ruhig schlafen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.