Retourner au contenu associé (entrée de forum : Lecture d'un fichier texte par colonne (débutant))
Posté par Florent C. le 06 mars 2005 à 21:18. En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.
#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; }
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル
[^] # Re: re
Posté par Florent C. . En réponse au message Lecture d'un fichier texte par colonne (débutant). Évalué à 3.
#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 ...