Zum Inhalt springen

Datum aus Hexstrem auslesen und als Namen verwenden


Fufialk

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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...