Zum Inhalt springen

Datum aus Hexstrem auslesen und als Namen verwenden


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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 Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...