anyanka
26-03-2009, 18:01
Salve ragazzi, avrei bisogno che mi aiutaste a capire da dove deriva il mio problema:
ho un programmino, creato su win, funzionante, che scrive in un file caratteri che corrispondono a codici (ASCII, unsigned char) che rappresentano altre stringhe.
Dovrebbe funzionare anche su linux perchè non uso nessuna funzione specifica per windows (credo!) invece anzichè scrivere i valori che mi aspetto, ne scrive altri [ad esempio dovrebbe scrivere 1 (codice ascii in decimale) e mi ritrovo un 156].... da cosa può dipendere?
Il codice è questo:
const unsigned char FLAG_BYTE = '\xFF' ;
const unsigned char END_OF_VALUES = '\xFE' ;
typedef struct {
string valore;
int num_occorrenze ;
unsigned char codice ;
} VALORI ;
typedef struct {
char * stringa ;
int dim ;
unsigned char flag ; // serve per differenziare un valore che è stato codificato da uno scritto così com'è,
} DATI_OUT ;
............
DATI_OUT contenuto_attributo = recupero_codice_attr(atts[i]) ;
output.write(contenuto_attributo.stringa, contenuto_attributo.dim) ;
output.write((char *)&contenuto_attributo.flag, sizeof(char));
DATI_OUT recupero_codice_attr(string val) {
DATI_OUT dati ;
VALORI valore_corrente ;
if(val.length() >= CARATTERI) {
valore_corrente = ricerca_valore(val) ;
if( valore_corrente.codice != FLAG_BYTE ) {
// new_output << "sizeof(valore_corrente.codice) = " << sizeof(valore_corrente.codice) << " " ;
dati.stringa = (char *)&valore_corrente.codice ;
// oss: nella conversione da unsigned char a char * il dato diventa da 1 a 3 caratteri....(???)
dati.dim = sizeof(valore_corrente.codice) ;
dati.flag = FLAG_BYTE ; // i valori che hanno flag = FLAG_BYTE sono stati codificati
}
else {
dati.stringa = (char *)val.c_str() ;
dati.dim = val.length() ;
dati.flag = END_OF_VALUES ; // ivalori che hanno flag = END_OF_VALUES non sono stati codificati
}
} else {
dati.stringa = (char *)val.c_str() ;
dati.dim = val.length() ;
dati.flag = END_OF_VALUES ;
}
return dati ;
}
mancano parecchie parti.. ma questo dovrebbe bastare...
ho un programmino, creato su win, funzionante, che scrive in un file caratteri che corrispondono a codici (ASCII, unsigned char) che rappresentano altre stringhe.
Dovrebbe funzionare anche su linux perchè non uso nessuna funzione specifica per windows (credo!) invece anzichè scrivere i valori che mi aspetto, ne scrive altri [ad esempio dovrebbe scrivere 1 (codice ascii in decimale) e mi ritrovo un 156].... da cosa può dipendere?
Il codice è questo:
const unsigned char FLAG_BYTE = '\xFF' ;
const unsigned char END_OF_VALUES = '\xFE' ;
typedef struct {
string valore;
int num_occorrenze ;
unsigned char codice ;
} VALORI ;
typedef struct {
char * stringa ;
int dim ;
unsigned char flag ; // serve per differenziare un valore che è stato codificato da uno scritto così com'è,
} DATI_OUT ;
............
DATI_OUT contenuto_attributo = recupero_codice_attr(atts[i]) ;
output.write(contenuto_attributo.stringa, contenuto_attributo.dim) ;
output.write((char *)&contenuto_attributo.flag, sizeof(char));
DATI_OUT recupero_codice_attr(string val) {
DATI_OUT dati ;
VALORI valore_corrente ;
if(val.length() >= CARATTERI) {
valore_corrente = ricerca_valore(val) ;
if( valore_corrente.codice != FLAG_BYTE ) {
// new_output << "sizeof(valore_corrente.codice) = " << sizeof(valore_corrente.codice) << " " ;
dati.stringa = (char *)&valore_corrente.codice ;
// oss: nella conversione da unsigned char a char * il dato diventa da 1 a 3 caratteri....(???)
dati.dim = sizeof(valore_corrente.codice) ;
dati.flag = FLAG_BYTE ; // i valori che hanno flag = FLAG_BYTE sono stati codificati
}
else {
dati.stringa = (char *)val.c_str() ;
dati.dim = val.length() ;
dati.flag = END_OF_VALUES ; // ivalori che hanno flag = END_OF_VALUES non sono stati codificati
}
} else {
dati.stringa = (char *)val.c_str() ;
dati.dim = val.length() ;
dati.flag = END_OF_VALUES ;
}
return dati ;
}
mancano parecchie parti.. ma questo dovrebbe bastare...