PDA

View Full Version : [C++] Scrittura Esadecimale con più cifre


kalindriv
28-06-2007, 23:25
Ciao ragazzi,
ho un problema stupido stupido, ma non so come risolverlo. C'è qualcuno che può darmi una mano?

io ho una stringa (letta da un file) così fatta: "0x00000049 13 0". Io devo leggere il primo numero esadecimale, modificarlo (chessò, ad esempio sottraendo 1) e poi ricreare l'esadecimale nella stessa forma. Posto il cuore del codice che ho realizzato: :read:


#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

#define DELIMITER " "

int main(){
char str[] = "0x00000049 13 0";
char *pch;
char *str2hex;
long int pos;
long int pos_modificato;

cout << "La stringa originale è : " << str << endl;

pch = strtok(str, DELIMITER);

pos = strtol(str, NULL, 16);
pos_modificato = pos-1;

cout << "La stringa estratta è : " << pch << endl;

cout << "In interi vale : " << pos << endl;
cout << "Il valore cercato è (sottraendo 1) :" << pos_modificato << endl;
cout << "che in esadecimale diventa : ";
cout.flags ( ios::hex | ios::showbase );
cout << pos_modificato << endl;
cout.flags ( ios::dec );
return 0;
}


L'output del programmino è : :read:

La stringa originale è : 0x00000049 13 0
La stringa estratta è : 0x00000049
In interi vale : 73
Il valore cercato è (sottraendo 1) :72
che in esadecimale diventa : 0x48

come vedete il risultato ultimo è 0x48. Mentre io vorrei che mi stampasse 0x00000048 !! Avete capito il problema? Mi serve assolutamente perchè devo rispettare delle specifiche del file sorgente!

ll problema somiglia tanto alla precisione del numero da stampare, ma in effetti non è questione di troncare, ma visualizzare il risultato su più cifre!
Ho provato con setprecision() o precision(), ma non mi sono sembrati d'aiuto!

Riuscite ad aiutarmi? :help:

kalindriv
28-06-2007, 23:34
praticamente, se dovessi scriverlo in C scriverei

printf("0x%08x\n", pos_modificato);

Quindi quello che cerco è l'equivalente usando il C++ con iostream. Per carità, una soluzione potrebbe essere usare proprio questo comando, ma sarebbe proprio poco elegante se tutto il resto è cout, cerr, cin, ecc... siete daccordo?

wingman87
28-06-2007, 23:52
Sostituisci il cout.flags che hai con questo:
cout.flags ( ios::hex | ios::showbase | ios::internal);
cout.width(10);
cout.fill('0');
Per riuscirci ho guardato qui:
http://www.cplusplus.com/reference/iostream/iostream/

kalindriv
29-06-2007, 00:06
Grazie mille!! In effetti anche io ho cercato sulle stesse pagine, e forse il fill è l'unica cosa che non ho provato perchè pensavo mi scrivesse 00000x48 o cose simili!! :D

Ora ho la certezza che tutto quello che si può far econ pritf e compari si può fare anche con C++!!

wingman87
29-06-2007, 00:18
Grazie mille!! In effetti anche io ho cercato sulle stesse pagine, e forse il fill è l'unica cosa che non ho provato perchè pensavo mi scrivesse 00000x48 o cose simili!!
Infatti se non si mette il flag ios::internal viene proprio una stringa così.