2016-11-22 1 views
0

J'ai besoin de lire 2 entiers dans une ligne et de les stocker en quelque sorte pour calculer la distance entre deux coordonnées.Comment utiliser fread() pour lire 2 entiers dans une ligne?

Ces codes seront fournis en binaire.

3 
122 188 
222 288 
322 388 

3 est le nombre de coordonnées présentes dans un fichier. (122) est x coor et (188) est y coor.

Jusqu'à présent, de ce que je reçois

FILE* fp = fopen(argv[1], "rb"); 

int points; 
long numbytesread=0; 

numbytesread= fread(&points, sizeof(int), 1, fp); 
+1

Quel problème avez-vous? – abacles

+0

vos données binaires n'ont probablement pas de saut de ligne – dvhh

+0

Le premier bloc de code * n'est pas * à quoi ressemble réellement le fichier, n'est-ce pas? – immibis

Répondre

1

Si vous avez un format binaire, vous aurez probablement finir par créer une structure de données (soit un struct ou un simple tableau d'un certain type) qui contiendra le contenu binaire représenté par une ligne dans votre exemple.

En supposant pour le moment que le format est simplement des entiers l'un à côté de l'autre dans la mémoire, le programme suivant devrait fonctionner.

#include <stdio.h> // printf 
#include <stdlib.h> // malloc 
#include <stdint.h> // standard int sizes (eg: int16_t, 16bit integer) 

typedef int16_t coordinate[2]; // just two integers, but convenient 

int main(int argc, char ** argv){ 
    FILE * fp = fopen(argv[1], "rb"); 
    int16_t number_of_coordinates = 0; 

    // read number of coordinates into our variable 
    fread(&number_of_coordinates, sizeof(int16_t), 1, fp); 
    printf("%d\n", number_of_coordinates); 

    // allocate space for our coordinates; 
    coordinate * coordinates = malloc(sizeof(coordinate) * number_of_coordinates); 

    // read all the coordinates at once 
    fread(coordinates, sizeof(coordinate), number_of_coordinates, fp); 

    // print them out just to prove it worked 
    int i; 
    for (i = 0; i < number_of_coordinates; i++){ 
     printf("%d %d\n", coordinates[i][0], coordinates[i][1]); 
    } 

    free(coordinates); // always free what you malloc 
    fclose(fp);  // always close what you open 
} 

EDIT Je mis à jour le code pour corriger quelques erreurs de syntaxe. Cela devrait maintenant fonctionner.

+0

'int' n'est pas une taille fixe, c'est * au moins * 16 bits. OTOH la taille des champs dans le fichier est fixe. Donc, en lisant 'sizeof (coordinate)' pourrait lire 4 octets, il pourrait lire 8, il pourrait lire 16. Il serait plus sûr d'utiliser un [nombre entier à largeur fixe de 'stdint.h'] (https: //en.wikipedia .org/wiki/C_data_types # Fixed-width_integer_types) pour 'coordinate'. L'OP n'a pas précisé quelle est la taille, mais je devine 'int16_t'. – Schwern

+1

bon point. Je vais mettre à jour – Mobius

+0

Salut, pouvez-vous expliquer un peu plus? Je ne comprends pas vraiment ce que vous faites avec coordonnée * coordonnée et malloc. –