2016-07-23 1 views
-1

J'éprouve des difficultés lorsque vous essayez de lire un entier à partir d'un fichier texte:troubles des opérations de lecture d'un nombre entier d'un fichier dans C

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    int op; 

    /* Open file for both reading and writing */ 
    FILE *d = fopen("intento1.txt", "r"); 
    FILE *f = fopen("bubbletry.txt", "w+"); 

    /* Read and display data */ 
    fread(&op, 4, 1, d); 

    printf("%d\n", &op); 
    fclose(d); 
    /* Write data to the file */ 
    fprintf(f,"%d\n",&op); 

    fclose(f); 

    return(0); 
} 

Le premier chiffre à « intento1.txt » est 30771, mais le texte écrit à "bubbletry.txt" est 926363699. Pourriez-vous me dire pourquoi cela se produit?

Répondre

3

Habituellement, pour lire un nombre entier ou similaire, vous pouvez utiliser fscanf à la place. C'est beaucoup plus pratique que fread.

fscanf(fp, "%d", &n); 

Pour un exemple, vérifiez http://www.cplusplus.com/reference/cstdio/fscanf/

+0

Merci! : D c'était très utile –

+1

fread est de lire des données binaires. fscanf est pour traiter les données binaires comme le format désiré –

5

Parce que vous avez lu les 4 premiers octets de intento1.txt, '3', '0', '7' '7', dans un entier. '3' est 0x33, '0' est 0x30, '7' est 0x37. Donc vous finissez par lire dans 0x33303737, mais parce que vous êtes sur une architecture petit-boutiste, les octets sont inversés à 0x37373033, qui est la représentation hexadécimale de 926363699, la représentation ascii de laquelle vous imprimez dans le fichier avec fprintf là. Ce que vous voulez, c'est analyser l'entier à partir de la représentation ASCII, soit en tirant sur la chaîne et en la convertissant, soit en utilisant quelque chose comme fscanf. Rappelez-vous que la représentation binaire d'un nombre n'est pas la même que sa représentation ASCII.

1

En plus de la réponse concernant l'utilisation de fread(), vous n'avez pas transmis les arguments voulus à vos fonctions correctement. Alors que fread() nécessite un pointeur comme argument (pointant vers la variable) à lire, les deux printf() et fprintf() nécessitent la valeur (pas l'adresse!) De l'argument formaté à imprimer. Ainsi, la même syntaxe en passant l'argument fonctionne pour les deux fonctions:

printf("%d\n", op); 

fprintf(f,"%d\n", op); 

Vous pouvez également trouver utile de lire ces messages: SO fread, reading text files with fread, fprintf.