• [^] # Re: re

    Posté par . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.

    Tout à fait, mais pour cela il faut en apprendre un peu sur les pointeurs. Bon, voilà ce que je te propose :
    #include <stdio.h>
    /* retourne le nombre de lignes d'un fichier texte deja ouvert */
    int get_nb_lines(FILE* fp)
    {
     unsigned int nb = 0;
     
     while (fgets(fp) != NULL) {
     nb++;
     }
     return nb;
    }
    /* recupere les valeurs dans v1 et v2 (passage par reference) */
    void get_values(char* ligne, float *v1, float *v2)
    {
     char* tmp:
     char* result;
     /* strtok modifie son premier argument, 
     on travaille donc sur une variable temporaire */
     strcpy(tmp, ligne);
     result = strtok(tmp, "\t, ");
     if(result != NULL) {
     sscanf(result, "%f", v1);
     
     result = strtok(NULL, "\t ");
     if(result != NULL) {
     sscanf(result, "%f", v2);
     }
     } 
    }
    int main(int argc, char* argv[])
    {
     FILE* fp = NULL;
     unsigned int nb_lines = 0;
     float *value1 = NULL,
     *value2 = NULL;
     int i = 0;
     char line[256] = "";
     
     
     fp = fopen("test.dat", "r");
     if (fp == NULL) return -1;
     nb_lines = get_nb_lines(fp);
     value1 = malloc(nb_lines * sizeof *value1);
     value2 = malloc(nb_lines * sizeof *value2);
     while((fgets(ligne, 256, fp) != NULL) 
     && (i<nb_lines)) {
     get_values(ligne, &(value1[i]), &(value2[i]));
     i++;
     } 
     /* et bien sur on libere la memoire */
     free(value1);
     value1 = NULL;
     free(value2);
     value2 = NULL;
     fclose(fp);
     fp = NULL;
     return 0;
    }
    
    Je ne l'ai pas testé ni même compilé, j'espère que ça marchera, en tout cas l'idée y est ...