2010-07-14 7 views
0

J'essaie de lire le contenu d'un fichier (qui contient à la fois du texte «standard» et des données «binaires»). Je dois ensuite prendre ce caractère (ASCII standard ou étendu) et obtenir la valeur ASCII décimale (int) correspondante.Lecture de caractères ASCII étendus à partir d'un fichier et conversion en valeur décimale ASCII

J'ai beaucoup de temps pour le faire fonctionner correctement.

Voici un extrait du code pour aider à montrer ce que je suis en train de faire ...

FILE *fp = fopen(file, "r+"); 

char *value = NULL; 

size_t charSize = sizeof(char) + 1; 

value = malloc(charSize); 

strcpy(value, "0"); 

fseek(fp, offset, SEEK_SET); 

fgets(value, charSize, fp); 

int c = (int)value; 

free(value); 

Je lis une chose qui était en train de dire que vous aviez besoin d'utiliser un unsigned char pour le ascii étendu, mais le changement de unsigned char n'a pas résolu le problème (et a compiler avertissements)

J'ai aussi essayé d'utiliser wchar_t avec le code:

.... 

wchar_t *value = NULL; 
value = malloc(2); 

wcscpy(value, (wchar_t *)""); 

fseek(fp, offset, SEEK_SET); 

fgetws(value, 2, fp); 

int c = (int)value; 

Aucun de ceux-ci semblent travailler . Je reçois soit un 0 pour pratiquement tout, soit une valeur "aléatoire".

Par exemple en utilisant une des trois que je reçois: valeur:% (correct) c: 76678304 (nombre est différent à chaque fois, mais dans ce même « gamme ») (quelque chose me dit que ce n'est pas correct):)

Je suis évidemment quelque chose de mal, mais je ne peux pas sembler figurer dehors ...

Toute aide serait très apprécié.

Répondre

2

Je pense que votre principal problème est:

int c = (int)value; 

Il devrait être:

int c = *value; 

Vous êtes valeur déréférencement pour obtenir le caractère à cette position. Ceci est équivalent à value[0]. Avant, vous jetiez un pointeur vers un int, ce qui explique les grandes valeurs de déchets. Ne jetez pas vos problèmes loin.

Le strcpy est redondant car fgets écrira les deux octets (le dernier étant un terminateur NUL) à moins d'avoir une erreur ou EOF. Si vous vouliez le terminer par NUL auparavant, vous utiliseriez '\ 0' (NUL), pas '0' (chiffre ASCII 0). Et vous pouvez simplement faire:

*value = '\0'; 
+0

qui semble fonctionner très bien pour « % » en utilisant ombles. Dois-je utiliser autre chose pour des ascii étendus ou puis-je encore utiliser char? – kdbdallas

+0

En fait, vous devriez plutôt vous assurer que le type de pointeur array/string est 'unsigned char *' (ou le convertir en tel) avant de le lire. BTW il n'y a pas de "ASCII étendu". –

+0

+1 pour avoir remarqué que l'ajout de distributions explicites pour éviter les avertissements/erreurs indique généralement que le code est erroné au départ. –

0

Votre code est beaucoup plus compliqué que cela doit être - vous pouvez simplement faire ceci:

FILE *fp = fopen(file, "r+"); 

fseek(fp, offset, SEEK_SET); 

int c = fgetc(fp); 
Questions connexes