2017-06-26 3 views
0

Fondamentalement, j'ai un fichier texte qui contient un nombre. J'ai changé le nombre à 0 pour commencer et puis j'ai lu 2 octets du fichier (parce qu'un int est 2 bytes) et je l'ai converti en int. J'imprime ensuite les résultats, mais il imprime des résultats bizarres. Donc, quand j'ai 0, j'imprime 2608 pour une raison quelconque.La lecture de 2 octets à partir d'un fichier et la conversion en un entier donne la mauvaise sortie

Je quitte un document qui dit que je dois lire un fichier où le décalage des octets 0 à 1 représente un nombre. C'est pourquoi je lis des octets au lieu de caractères ...

J'imagine que le problème est dû à la lecture d'octets au lieu de la lecture par caractères, donc si c'est le cas, pouvez-vous expliquer pourquoi cela ferait une différence ?

Voici mon code:

void readFile(FILE *file) { 
    char buf[2]; 
    int numRecords; 

    fread(buf, 1, 2, file); 

    numRecords = buf[0] | buf[1] << 8; 

    printf("numRecords = %d\n", numRecords); 
} 

Je ne suis pas vraiment sûr de ce que le buf [0] | buf [1] < < 8 fait, mais je l'ai eu d'une autre question ... Donc je suppose que cela pourrait être le problème aussi bien.

+1

Décidez-vous. Soit vous avez un fichier texte ou vous avez un fichier avec des entiers binaires de 2 octets. Pas les deux en même temps. – EJP

+0

@EJP J'ai complètement effacé et j'ai oublié que mon int serait sous forme ASCII. – Logan

Répondre

3

Le numéro 0 dans votre fichier texte sera en réalité représenté par un nombre hexadécimal de 1 octet 0x30. 0x30 est chargé à buf[0]. (Dans la table ASCII , 0 est représenté par 0x30)

Vous avez des données à ordures dans buf[1], la valeur est 0x0a dans ce cas. (0x0a est \n dans la table ASCII)

La combinaison de ces deux par buf[0] | buf[1] << 8 résultats dans 0x0a30 qui est 2608 en décimal. Notez que << est l'opérateur de décalage gauche bit par bit.

(En outre, la taille de int type est de 4 octets dans de nombreux systèmes. Vous devriez vérifier.)

+0

Merci pour votre réponse rapide. Existe-t-il un autre moyen d'écrire en quelque sorte les octets réels d'un int dans un fichier pour pouvoir tester mon programme? – Logan

+0

Essayez 'fprintf (fichier,"% d ", numRecords)'. Cela va convertir 'int' en texte correspondant. Si vous voulez écrire les octets réels, vous pouvez faire 'fwrite'. – nglee

+0

J'ai donc essayé d'utiliser fprintf (fichier, "% d", numRecords) et puis j'ai couru mon code sur la sortie et il imprime maintenant 48 ... Pensez-vous que c'est un problème avec readFile()? – Logan

0

Vous pouvez lire directement en entier

fread(&numRecords, sizeof(numRecords), 1, file); 

Vous devez vérifier sizeof(int) sur votre système, si ses quatre octets vous devez déclarer numRecords comme short int plutôt que int