Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Problème de lecture de fichier en c
Envoyé par: gizida

j'essaie d'être le plus explicite possile.

J'ai un fichier texte de la forme

5
Hydrogene H 1 1.00794
Helium He 2 4.00260
Lithium Li 3 6.94100
Beryllium Be 4 9.01218
Bore B 5 10.81000

(5 c le nombre de lignes qui suivent)

pour ça , j'utilise ce programme :

void lecture(char* nomfichier,element* tableau, int *n)
{
char nom_temp[20], sym_temp[10], lignes[200] ;
int i,longueur;
int numero; float masse;
FILE *fichier=fopen(nomfichier,"r");
if (fichier==NULL)
{printf("file not found");
exit(1);
}
fgets(lignes,60,fichier);
sscanf(lignes,"%d",n);

for (i=1;i<=longueur;i++)
{
fgets(lignes,190,fichier);
sscanf(lignes,"%s%s%d%f",nom_temp,sym_temp,&numero,&masse);
tableau.nom=(char*) malloc((strlen(nom_temp)+1)*sizeof(char));
tableau.sym=(char*) malloc((strlen(sym_temp)+1)*sizeof(char));
if (tableau.nom==NULL || tableau.sym==NULL)
{printf("probleme de memoire");
exit(1);
}
strcpy(tableau.nom,nom_temp);
strcpy(tableau.sym,sym_temp);
tableau.numero=numero;
tableau.masse=masse;
}

}


le problème, c k'il me sort ke des NULL et des 0.
kelk'un voit le pb?

Poste le Thursday 6 October 2005 17:23:28
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: nicola

Peut-être que tu as essayé du C en SMS et que le compilateur n’a pas aimé.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Thursday 6 October 2005 17:57:08
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: gizida

Bon, c'est pas pour dire, mais comme sms dans mon message il y a juste :
c = c'est
kelk'un = quelqu'un
ke=que
pb = problème.

bon, à moins d'avoir le cerveau d'un compilateur, c'est facilement et rapidement compréhensible par n'importe quel être humain.
Et, si c'est pour dire des trucs sans intérêt, rien n'oblige qui que ce soit à poster

(ps: j'éspère sincèrement que c'était pas une tentative de faire de l'humour)

Poste le Thursday 6 October 2005 21:28:20
Répondre     Citer    
Re: Problème de lecture de fichier en c

Non, c'est pas de l'humour. Tu n'as pas du relire le cadre rose

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Friday 7 October 2005 07:05:49
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: Sve@r

Citation
gizida
j'essaie d'être le plus explicite possile.

J'ai un fichier texte de la forme

5
Hydrogene H 1 1.00794
Helium He 2 4.00260
Lithium Li 3 6.94100
Beryllium Be 4 9.01218
Bore B 5 10.81000

(5 c le nombre de lignes qui suivent)

pour ça , j'utilise ce programme :

void lecture(char* nomfichier,element* tableau,
int *n)
{
char nom_temp[20], sym_temp[10], lignes[200] ;
int i,longueur;
int numero; float masse;
FILE *fichier=fopen(nomfichier,"r");
if (fichier==NULL)
{printf("file not found");
exit(1);
}
fgets(lignes,60,fichier);
sscanf(lignes,"%d",n);

for (i=1;i<=longueur;i++)
{
fgets(lignes,190,fichier);

sscanf(lignes,"%s%s%d%f",nom_temp,sym_temp,&nu
mero,&masse);
tableau.nom=(char*)
malloc((strlen(nom_temp)+1)*sizeof(char));
tableau.sym=(char*)
malloc((strlen(sym_temp)+1)*sizeof(char));
if (tableau.nom==NULL ||
tableau.sym==NULL)
{printf("probleme de memoire");
exit(1);
}
strcpy(tableau.nom,nom_temp);
strcpy(tableau.sym,sym_temp);
tableau.numero=numero;
tableau.masse=masse;
}

}


le problème, c k'il me sort ke des NULL et des 0.
kelk'un voit le pb?

Hum... ton programme présente quelques erreurs
1) pourquoi tu passes "n" en paramètre à ta fonction ? Sauf si tu veux qu'au retour de ta fonction la variable qui correspond contienne la dernière valeur lue, cela n'a aucun intérêt. J'espère quand-même que, lorsque tu appelles ta fonction, tu lui passes à cet endroit une adresse !!!

2) que vaut la variable "longueur" dans "for (i=1; i <= longueur; i++)

3) en C, le premier élément d'un tableau commence toujours à "0", pas à "1"

4) tu fais des malloc dans ta boucle sans jamais conserver la valeur allouée d'une boucle sur l'autre. Au sortir de ta boucle, si tu as fait 1000 itérations, tu auras réservé 999 blocs de mémoire désormais inaccessibles et tu n'auras accès qu'au dernier bloc alloué

5) ce n'est pas la peine de faire "ligne[200]" si tu ne remplis que 190 octets à chaque fois

6) on ne sort JAMAIS d'une fonction par "exit". C'est sale. Le "exit" est réservé au "main" et éventuellement au processus fils du "fork"

7) pour mémoriser "n" lignes de 3 colonnes, il faut utiliser un tableau en 2 dimensions ou mieux, un tableau de structure

8) si ta ligne contient des mots séparés par un "espace", il faut que "sscanf" sache qu'il y a un espace => "%s %s %d" et non "%s%s%d"

9) après un "fopen" il faut faire un "fclose"

Essaye de mieux réfléchir à la manière que tu veux que ton programme travaille pour mieux réécrire ta fonction...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 7 October 2005 08:00:54
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: Sve@r

Citation
Sve@r
1) pourquoi tu passes "n" en paramètre à ta
fonction ? Sauf si tu veux qu'au retour de ta
fonction la variable qui correspond contienne la
dernière valeur lue, cela n'a aucun intérêt.
J'espère quand-même que, lorsque tu appelles ta
fonction, tu lui passes à cet endroit une adresse
!!!

2) que vaut la variable "longueur" dans "for (i=1;
i <= longueur; i++)

3) en C, le premier élément d'un tableau commence
toujours à "0", pas à "1"

4) tu fais des malloc dans ta boucle sans jamais
conserver la valeur allouée d'une boucle sur
l'autre. Au sortir de ta boucle, si tu as fait
1000 itérations, tu auras réservé 999 blocs de
mémoire désormais inaccessibles et tu n'auras
accès qu'au dernier bloc alloué

5) ce n'est pas la peine de faire "ligne[200]" si
tu ne remplis que 190 octets à chaque fois

6) on ne sort JAMAIS d'une fonction par "exit".
C'est sale. Le "exit" est réservé au "main" et
éventuellement au processus fils du "fork"

7) pour mémoriser "n" lignes de 3 colonnes, il
faut utiliser un tableau en 2 dimensions ou mieux,
un tableau de structure

8) si ta ligne contient des mots séparés par un
"espace", il faut que "sscanf" sache qu'il y a un
espace => "%s %s %d" et non "%s%s%d"

9) après un "fopen" il faut faire un "fclose"

Oublie les points 4 et 7. je devais pas être bien réveillé ou alors il y a eu bug dans la retranscription de ton code. J'avais pas vu les "" référençant tes "tableau.nom=malloc(...)"
Cependant, pourquoi faire du malloc alors que tu sembles certain que "nom" ne fera pas plus de 19 caractères et "sym" n'en fera pas plus de 9 ???
Je vois que tu utilises une structure qui est de type "element". Elle doit probablement être de ce style
typedef struct {
....char *nom;
....char *sym;
....int numero;
....double masse;
} element;

Autant l'écrire directement ainsi :
typedef struct {
....char nom[20];
....char sym[10];
....int numero;
....double masse;
} element;
Et ne plus faire de malloc.

Par ailleurs, remplir une variable "nom_temp" puis recopier "nom_temp" dans "tableau.nom" est inutile. Autant remplir directement "tableau.nom". Idem pour les autres membres...

PS: Pour la bonne compréhension d'un code, il est préférable de nommer ses types "t_qqchose" ou "qqchose_t"



L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 7 October 2005 08:40:32
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: nicola

Citation
gizida
Bon, c'est pas pour dire, mais comme sms dans mon
message il y a juste :
c = c'est
kelk'un = quelqu'un
ke=que
pb = problème.

Pas seulement. Passons.

Citation

bon, à moins d'avoir le cerveau d'un compilateur, c'est facilement et rapidement compréhensible par n'importe quel être humain.

Oui mais c’est super chiant à lire.

Citation

Et, si c'est pour dire des trucs sans intérêt, rien n'oblige qui que ce soit à poster

Oui, ni à lire du SMS. Ce phorum n’est pas un portable.

Citation

(ps: j'éspère sincèrement que c'était pas une tentative de faire de l'humour)

En partie.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Friday 7 October 2005 15:47:02
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: abgech

Nicola,

Je ne peux que t'approuver !

Personnellement, je refuse de répondre à des post qui contiennent du sms, parce que je considère que c'est une insulte à l'égard du lecteur.
Et je sais que je suis loin d'être le seul à le faire.

Poste le Friday 7 October 2005 16:05:13
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: abgech

Et pour enfoncer encore le clou:

Comment une personne qui utilise le sms peut-elle espérer un jour savoir programmer. Les langages de programmation ont une syntaxe infiniment plus rigoureuse que la langue française, alors si l'on est même incapable d'écrire en français ...

D'ailleurs le code qui nous est présenté en est une illustration: quel galimatias !

..................
Parce qu'il avait une clôture à utiliser, l'homme invente la propriété privée. --- F. Cavanna

Poste le Friday 7 October 2005 16:08:58
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: gizida

Oulà j'étais absent un jour et déjà 7 réponses de plus, on va y aller un par un.(pas dans l'ordre)

1- finalement j'ai russi mais je sais pas comment. Merci quand même beaucoup pour avoir pris le temps d'essayer de comprendre ce truc pas vraiment explicite c'est vrai.

2- je passais bien une adresses en appelant la fonction, j'avais besoin de la longueur du tableau dans la suite.

3- je remplissais le tableau à partir de 1 pour m'éviter des calculs chiant avec l'algorithme du tritas (avoir les fils gauche et droit); et non pas parce que j'ignorais qu'un tableau commence à 0. Quand même!!! grinning smiley

4- Je faisais du malloc parce que c'était imposé, et du coup j'étais obligé de passer par nom_temp et sym_temp.

5-
Citation
nicola
Oui, ni à lire du SMS. Ce phorum n’est pas un portable
je ne t'ai pas obligé de lire mon message, et dire que c'est super chiant à lire...

6-abgech bon j'avoue avoir rit en voyant tes superbes arguments sur mon incapacité de parler la langue Française (dont la rigueur est douteux à mon goût, il n'y a qu'à voir la conjugaison) et son lien avec mon incapacité à programmer. Je pense que je vais éviter de répondre, tu m'excuseras de pas faire d'attaques personnelles, disons que j'ai comme principe non pas de poster des trucs sans intérêt, mais plutôt de rien dire quand je connais pas la personne en face.
je dirai juste une chose, que tu veuille pas répondre à des messages qui comportent du sms je veux bien comprendre, mais pourquoi avoir répondu ici?
tu pensais que ce que t'avais à dire était vraiment intéressant?


Poste le Friday 7 October 2005 19:55:07
Répondre     Citer    
Re: Problème de lecture de fichier en C
Envoyé par: nicola

Citation
gizida
1- finalement j'ai russi mais je sais pas comment. Merci quand même beaucoup pour avoir pris le temps d'essayer de comprendre ce truc pas vraiment explicite c'est vrai.

Content pour toi.

Citation

5-nicola a écrit :Oui, ni à lire du SMS. Ce phorum n’est pas un portable

je ne t'ai pas obligé de lire mon message, et dire que c'est super chiant à lire...

Non, mais il faut dire que le SMS n’apparaît qu’à la fin du message et les usages ici sont clairs. Si tu ne veux pas les suivre, tu peux aller voir sur un phorum où le SMS est usité. Cela dit, tu t’en passes très bien depuis.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Friday 7 October 2005 19:59:38
Répondre     Citer    
Re: Problème de lecture de fichier en c
Envoyé par: gizida

Franchement c'est de la mauvaise foi, j'avoue ne pas avoir regardé l'encadré; mais tant que ça nuit pas à la compréhension, pourquoi pas, ça va tellement plus vite de taper "c" que de taper "c'est" (4 caractères pour rien).

Poste le Friday 7 October 2005 20:45:04
Répondre     Citer    
Re: Problème de lecture de fichier en C
Envoyé par: nicola

Non, pas pour rien : pour que tout le monde puisse te comprendre, parce que le SMS est plus long à déchiffrer que le français (et combien de fractions de secondes gagnes-tu à taper en SMS, crois-tu que ça vaille le coup ?), sans compter ceux qui ne connaissent pas le SMS ; et pour ne pas laisser une apparance de foutage de gueule.

--
On ne prête qu’aux riches, et on a bien raison, parce que les autres remboursent difficilement.
-+- Tristan Bernard (1866-1947) -+-

Poste le Friday 7 October 2005 21:17:29
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Problème de lecture de fichier en c
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons