2017-03-21 1 views
0

J'ai un fichier de données binaires. Il existe plus de 4 millions d'enregistrements de données LIDAR. Chaque enregistrement est stocké sous la forme de quatre nombres - trois flottants (coordonnées x, y, z) et un entier (sans importance maintenant). Je devrais implémenter une fonction qui obtient des coordonnées minimales et maximales dans tous les axes. J'ai écrit le code ci-dessous, l'algorithme semble être très simple et simple, mais ça ne marche pas (il renvoie tous les minimums comme 0.0f et chaque maximum comme 1.0f). Est-ce que j'ai quelque chose de mal?Lecture des données binaires - trouver les coordonnées min et max

void get_min_max(const char *filename, float *a_min_x, float *a_max_x, float *a_min_y, float *a_max_y, float *a_min_z, float *a_max_z) { 
    FILE *f = NULL; 
    float x, y, z; 
    float min_x, min_y, min_z, max_x, max_y, max_z; 
    int l_type; 

    f = fopen(filename, "rb"); 

    if (!f) { 
    printf("No binary file read!\n"); 
    exit(-1); 
    } 

    min_x = min_y = min_z = std::numeric_limits<float>::max(); 
    max_x = max_y = max_z = -std::numeric_limits<float>::max(); 

    while (true) { 
    x = fread((void*)(&x), sizeof(x), 1, f); 
    y = fread((void*)(&y), sizeof(y), 1, f); 
    z = fread((void*)(&z), sizeof(z), 1, f); 

    min_x = fminf(x, min_x); 
    min_y = fminf(y, min_y); 
    min_z = fminf(z, min_z); 

    max_x = fmaxf(x, max_x); 
    max_y = fmaxf(y, max_y); 
    max_z = fmaxf(z, max_z); 

    l_type = fread((void*)(&l_type), sizeof(l_type), 1, f); 

    if (feof(f)) { 
     break; 
    } 
    } 

    fclose(f); 

    *a_min_x = min_x; // = 0.0f ??? 
    *a_min_y = min_y; // = 0.0f ??? 
    *a_min_z = min_z; // = 0.0f ??? 

    *a_max_x = max_x; // = 1.0f ??? 
    *a_max_y = max_y; // = 1.0f ??? 
    *a_max_z = max_z; // = 1.0f ??? 
} 
+1

Note: les codes de sortie négatifs sont normalement réservés à l'environnement. Vous devriez retourner de petits entiers positifs. Pourquoi ne vérifiez-vous pas le résultat de 'fread'? Pourquoi utiliser feof? – Olaf

+1

Et pourquoi est-ce marqué C, bien qu'il soit évidemment C++? – Olaf

+0

Vos nombres maximum sont définis comme '-std :: numeric_limits :: max();'. Maintenant, cela pourrait être une faute de frappe, mais il a un - le rendant négatif. –

Répondre

5

Votre problème est d'attribuer fread s résultat dans votre variable:

x = fread(&x, ...) 

Première fread lit les données dans x, il retourne le nombre d'éléments de lecture (1), puis x devient 1.0 .

Vous devriez vraiment apprendre à utiliser un débogueur, vous auriez vu cela très rapidement.

+0

Salut encore, merci beaucoup. Tu as raison, je vais l'apprendre. – Honza