Je débute dans le C, aussi ai-je une question basique mais qui me pose beaucoup de problèmes.
Je dispose d'un fichier de données comportant deux colonnes de chiffres (entier ou flottants), séparés par un séparateur qui peut être une espace, un tab ou une virgule.
Je voudrais lire ce fichier pour stocker les valeurs de chaque colonne dans un tableau.
Pour l'instant, je n'arrive qu'à lire ligne par ligne...
Voici ce que j'ai :
int main()
{
FILE *fp;
fp = open("data.dat","r");
char ligne[81];
while (fgets(ligne,81,fp) != NULL)
{
printf("%s",ligne);
}
}
Maintenant, il faut que je j'identifie mes colonnes, mais je ne sais pas comment faire...
Quelqu'un aurait-il un début de solution ?
Ou un début de doc sur ce problème ?
Merci,
Darckense
# re
Posté par LaBienPensanceMaTuer . Évalué à 2.
Par contre, prend garde au buffer overflow ...
[^] # Re: re
Posté par elloco (site web personnel) . Évalué à 2.
je n'ai pas essayé si ça compilais ni même si ça marchais mais cela devrait te permettre de t'approcher d'une solution fonctionnelle.
#include <stdio.h>
int main()
{
FILE *fp;
int i = 0;
float nombre1, nombre2;
float tab1[200];
float tab2[200];
fp = open("data.dat","r");
if (f != NULL)
{
while(fscanf(fp, "%f %f", &nombre1, &nombre2) != EOF)
{
tab1[i] = nombre1;
tab2[i] = nombre2;
i += 1;
}
}
return 0;
}
[^] # Re: re
Posté par Florent C. . Évalué à 3.
Donc, on ne doit utiliser les fonctions *scanf que pour interpréter des données écrites par les fonctions *printf !
Autrement, on utilise fgets, puis, au choix, strtok (si l'on est sûr est certain de ne pas avoir besoin de réentrance), ou strtok_r, ou alencore on interprète "à la main" ...
[^] # Re: re
Posté par Darckense (site web personnel) . Évalué à 2.
Je suis quasiment certain qu'il n'y a pas d"erreur de saisie... :-)
Pour fgets, d'accords, mais encore faut-il pouvoir découper la chaine "à la main" comme tu dis, et ce n'est pas spécialement évident pour un novice comme moi.
Darckense
[^] # Re: re
Posté par doublehp (site web personnel) . Évalué à 3.
( quoi que avec un 2.6.10, la suprise se limite a un segfault, sur le 2.6.8, c etait tout l affichage qui partait en vrille ... genre des lignes rouges sur mon image de bureau, mais pas sur les fenetres )
si tu veux t assurer du format du fichier, tu peut le preparser en perl/awk/sed/cut/tr/uniq ...
J utilise rarement le C seul dans un projet ... j ai toujours d autres scripts en d autres langages a cote.
[^] # Re: re
Posté par Florent C. . Évalué à 3.
Bon, ok, à partir de maintenant je suppose que tu pensais plutôt à fopen(), qui prend bien ce genre de paramètres, et est bien déclarée dans stdio.h.
Sans parler de l'utilisation de fscanf sans aucune précaution. fscanf retourne le nombre de valeurs assignées. Tu devrais vérifier cette valeur de retour en plus de EOF. Et, comme dit dans mon autre message, fscanf ne devrait être utilisé que pour lire des données formattées par les fonctions de la série des *printf ...
Bref, beaucoup de choses à revoir :)
[^] # Re: re
Posté par Darckense (site web personnel) . Évalué à 2.
Du genre je scanne deux fois le fichier texte. Une première fois pour lire le nombre de lignes disponibles. Ensuite, je créé les tableaux de taille ad-hoc, et je relis une seconde fois pour sauver les données dans mon tableau.
Ou encore, si la première ligne du fichier indique le nombre de ligne de données, il me suffit de lire cette ligne pour créer mes tableaux, et ensuite sauver mes données ??
Darckense
[^] # Re: re
Posté par Florent C. . Évalué à 3.
[^] # Re: re
Posté par Florent C. . Évalué à 2.
[^] # Re: re
Posté par Darckense (site web personnel) . Évalué à 1.
Impressionnant.
Bon, j'ai déjà ce que je voulais faire, même si c'est perfectible.
Demain, je file m'acheter un bouquin sur le C, et je regarde ta fonction get_nb_lines de plus prés.
Ahlala, que ne faut-il pas faire pour fitter ses données sous linux ! Heureusement qu'il y a les Numerical Recipes ! :-)
Darckense
[^] # Re: re
Posté par Florent C. . Évalué à 1.
[^] # Re: re
Posté par Darckense (site web personnel) . Évalué à 1.
Merci beaucoup pour le code. Ca compile presque. En fait, il faut utiliser fopen() au lieu de open(), et tout marche nickel ! ;-)
Encore une fois merci,
Amicalement,
Darckense
[^] # Re: re
Posté par Darckense (site web personnel) . Évalué à 1.
Trés instructif.
Merci.
Darckense
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.