Veröffentlicht 6. Juli 200520 j 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.
6. Juli 200520 j 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
6. Juli 200520 j Autor 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?
6. Juli 200520 j Autor 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.
6. Juli 200520 j 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
6. Juli 200520 j Autor 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.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.