2009-12-05 4 views
2

je fais un programme où je dois charger des données à virgule flottante du format d'un fichier
103,45
123,45
456,67
......
lecture des données dans un réseau de flotteurs en C

Je me demandais comment stocker ces données directement dans un tableau de nombres à virgule flottante en utilisant fread(). Je suppose que ce n'est pas si difficile d'utiliser des pointeurs mais je ne suis pas très bon avec eux. Quelqu'un peut-il me dire comment

Répondre

2

Vous ne pouvez pas utiliser fread car cela n'analyse pas la forme du fichier que vous avez. fread lit juste octets dans un tableau d'octets et ce que vous avez est écrit des nombres dans une forme décimale lisible par l'homme.

Je pense que pour ce format de la manière la plus directe que vous pouvez utiliser est d'utiliser fscanf dans une boucle, en étant sûr de vérifier la valeur de retour et, en cas d'échec, ferror et/ou feof pour vérifier si vous frappez la fin du fichier ou une autre erreur.

+0

Tout le reste étant sain d'esprit, il peut lancer le tableau float dans un octet * requis par fread. –

+0

Il pourrait le faire, mais cela ne fonctionnerait pas car il ne remplirait un tableau flottant avec des valeurs valides que si le fichier d'entrée était un vidage binaire fait dans un style similaire avec un fwrite. Ce que sfactor a décrit est un fichier texte float par ligne dans un format décimal lisible par l'homme. –

+0

Oui, il y a des informations contradictoires dans sa question. –

2

vous ne pouvez pas, sauf si votre fichier de données est en binaire fromat. Vous montrez un fichier texte de plaint: pour l'obtenir dans un tableau, vous devrez faire quelques choses: trouver combien d'éléments sont nécessaires dans le tableau (nombre de lignes?), Allouer le tableau, puis convertir et mettre chaque valeur dans le tableau. La conversion peut être faite en utilisant scanf par exemple.

0

Comme cela ressemble à un fichier avec ASCII, je publie la stratégie suivante. Cependant, vous semblez suggérer que le fichier contient des données binaires. Cette hypothèse est basée sur le fait que vous essayez de le lire avec fread().

Continuez à lire une ligne à la fois à partir du fichier et analysez la chaîne d'entrée du fichier dans un fichier flottant, jusqu'à ce que le fichier renvoie EOF.

+0

non le fichier est un fichier texte avec ces valeurs dans chaque ligne.Je suis allé aussi loin que l'ouverture du fichier et l'obtention de la taille de fichier, maintenant comment allouer de la mémoire à la matrice à virgule flottante et les lire un à la fois à partir du fichier texte. – sfactor

3

Je ne sais pas ce que vous avez besoin, mais cela permet de résoudre l'essence du problème:

int j = 0; 
double flts [20000]; 
while (!feof(f)) 
{ 
    if (fscanf (f, "%g", &flts [j]) == 1) 
     ++j; // if converted a value okay, increment counter 
} 
+0

merci à tous pour les réponses ... j'ai réussi à obtenir les valeurs dans un tableau à virgule flottante .... mais maintenant le problème est que les valeurs dans le tableau ont une précision supplémentaire, par exemple 107.94 est stocké comme 107.940002 105.76 est stocké comme 105.760002 105.22 est stocké comme 105.220001 où est cette précision supplémentaire venant de? ... les données réelles ont seulement une précision de 2 points décimaux. j'ai essayé de faire fscanf (f, "% 0.2f", & data [i]) .... mais cela ne fonctionne pas? – sfactor

+0

S'il était chargé dans un tableau de 'float' puis affiché en utilisant say% 10g, c'est le genre de bruit que vous verriez par manque de précision. 'float's ont 6 à 7 chiffres significatifs de précision. 'double's ont 15 à 16 chiffres significatifs de précision. – wallyk

4

Pour lire les données de l'utilisation de fichiers fgets() et sscanf().

/* needs validation and error checking */ 
fgets(buf, sizeof buf, fp); 
sscanf(buf, "%f", &tmp); 

Pour gérer le nombre de flottants, vous avez deux options.

  1. utiliser un tableau de taille fixe
  2. utilisation malloc(), realloc() et amis pour un tableau Growable

/* 1. use an array of fixed size */ 
float array[1000]; 

/* 2. use `malloc()`, `realloc()` and friends for a growable array */ 
float *array; 
array = malloc(1000 * sizeof *array); 
/* ... start loop to read floats ... */ 
    if (array_needs_to_grow) { 
     float *tmp = realloc(array, new_size); 
     if (tmp == NULL) /* oops, error: no memory */; 
     array = tmp; 
    } 
/* end reading loop */ 
/* ... use array ... */ 
free(array); 
+0

+1 pour lancer dans malloc/realloc –

+0

+1 pour vérifier '* tmp' après' realloc'. – Unheilig

Questions connexes