Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
creation d'un fichier en langage c
Envoyé par: mima

je voudrais savoir comment a partir d'une structure erudiant nom prenom etc... on peut creer un fichier contenant n etudiants puis afficher leur nom prenom et moyenne svp j'ai un projet a rendre et on a pas encore fait le cours de fichier svp j'ai besoin de votre aide a l'instant la ce serait genial merci j'attend votre reponse avec impatience

Poste le Tuesday 11 April 2006 17:46:03
Répondre     Citer    
Re: création d’un fichier en langage c
Envoyé par: nicola

Un fichier en langage C qui contient des données ? Quel est l’intérêt ? Il te faut un tableau ?
P.S. : Les accents, la ponctuation et la casse ne sont pas superflus.

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

Poste le Tuesday 11 April 2006 18:08:53
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: Sve@r

Citation
mima
je voudrais savoir comment a partir d'une
structure erudiant nom prenom etc... on peut creer
un fichier contenant n etudiants puis afficher
leur nom prenom et moyenne

En C, un fichier n'est qu'une suite d'octets sans aucune structure. Le programmeur doit donc se définir une structure personnelle qu'il pourra ensuite traiter
Exemple: chaque ligne contiendra nom, prénom et moyenne et chaque valeur sera séparée de l'autre par le caractère ":"

Une fois qu'on a défini sa structure pour son fichier, il n'y a plus qu'à programmer avec les fonctions de manipulations
fopen() => permet d'ouvrir un fichier pour y lire ou écrire ou les deux (au choix). La fonction renvoie un pointeur sur le fichier ou "NULL" si on peut pas ouvrir le fichier pour une raison ou pour une autre
fgets() => récupère une ligne du fichier et positionne le pointeur sur la ligne suivante - Renvoie "NULL" quand on est arrivé à la fin du fichier
fputs() => écrit une ligne dans le fichier à l'endroit positionné par le pointeur
fprintf() => fonctionne comme "printf" mais le texte écrit est écrit dans le fichier (et non l'écran)
fclose() => ferme le fichier
=> plus d'info sur chaque fonction avec le "man" => man fopen

Cours complet de C en français ici:
[fr.lang.free.fr]


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

Poste le Tuesday 11 April 2006 19:05:30
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: mima

merci g cree le tableau mai ca ne m'avance en rien si je sai pas comment on le manipule pour creer le fichier avec fprintf etc...

Poste le Tuesday 11 April 2006 20:20:36
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: Sve@r

Citation
mima
merci g cree le tableau mai ca ne m'avance en rien
si je sai pas comment on le manipule pour creer le
fichier avec fprintf etc...

Admettons que tu aies une structure comme ceci
struct s_eleve {
....char nom[21];
....char prenom[21];
....double moyenne;
};

Tu as ensuite ton tableau d'élèves comme ceci
struct s_eleve tabEleve[]={
....{"Legrand", "Pierre", 12.5},
....{"Ledur", "Paul", 13.5},
....{"Lefort", "Roland", 7.5},
....{NULL, NULL, 0}
};

Il te suffit, pour stocker ton tableau dans ton fichier, d'utiliser un algo de ce style :

FILE *fp;
struct s_eleve *ptEleve;

fp=fopen("fichier", "w");

for (ptEleve=tabEleve; ptEleve->nom != NULL; ptEleve++)
....fprintf(fp, "%s:%s:%f\n",ptEleve->nom, ptEleve->prenom, ptEleve->moyenne);

fclose(fp);

Si t'as pas appris les pointeurs sur structure, t'as la même chose ainsi

FILE *fp;
int i;
fp=fopen("fichier", "w");

for (i=0; tabEleve.nom != NULL; i++)
....fprintf(fp, "%s:%s:%f\n",tabEleve.nom, tabEleve.prenom, tabEleve.moyenne);

fclose(fp);

1) lis les cours
2) lis le man


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

Poste le Tuesday 11 April 2006 21:18:33
Répondre     Citer    
Re: creation d'un fichier en langage c

On peut toujours mettre des données dans un format compatible avec C. Par exemple, un fichier XPM est du code C valide.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Saturday 22 April 2006 00:51:13
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: nizar

utilise fwrite ca va être plus souple et plus simple pour la manipulation d'un tableau pour le stocker dans un fichier

fwrite(tabEleve,sizeof(tabEleve[0]), «nbrelem_du_tableau» ,fp);

Poste le Monday 24 April 2006 16:55:24
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: abgech

Citation
nizar
utilise fwrite ca va être plus souple et plus simple pour la manipulation d'un tableau pour le stocker dans un fichier

Absolument.

Et, en plus, infiniment plus rapide, fprintf est très lent, dans la mesure où il interprète le format au moment de l'exécution.

Poste le Monday 24 April 2006 17:06:10
Répondre     Citer    
Re: creation d'un fichier en langage c

L'avantage d'un fprintf, c'est de produire généralement (quand les données sont correctes) un fichier textuel lisible avec un simple éditeur, et (souvent) portable d'une architecture à l'autre: un fichier textuel produit sur x86 sera relisible sur un PowerPC. Ce n'est pas le cas avec fwrite (sauf précautions particulières).

C'est vrai que fprintf est plus lent en CPU que fwrite, mais le temps d'accès physique sur le disque est (assez souvent) fortement prédominant.

En gros, pour un débutant, je conseille fprintf.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 24 April 2006 18:35:46
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: abgech

Citation
Basile STARYNKEVITCH
...
En gros, pour un débutant, je conseille fprintf.
...

En tant qu'enseignant, je me permets de ne pas partager ton avis: il faut enseigner au débutant les bonnes façon de traiter les problèmes, et ceci dès le début. Dans le cas d'espèce, il faut montrer le gain de temps et de place sur fichier procuré par une mémorisation en binaire sur support externe. Autrement, on cours le risque de voir des gens rester sur une solution qui paraît séduisante de prime abord, mais qui, en fait, est calamiteuse. Et c'est comme ça qu'on obtient des Windows NT, prétendument micro-noyau de 1 Mo :-D, alors que MACH fait moins de 50 Ko smiling smiley#.

Tu parles de portabilité, c'est un point qui peut se discuter. Avec la structure qui est proposée plus haut:
struct s_eleve {
....char nom[21];
....char prenom[21];
....double moyenne;
};
il n'y a que moyenne qui ne serait pas portable, et encore, j'utilise le conditionel à dessein: actuellement les types "virgule flottante" sont normalisés au niveau du matériel et peuvent souvent être repris tels quels (ce n'est pas, malheureusement, le cas des entiers). Dans le cas précis, la seule chose qui pourrait poser des problème de portabilité, c'est les bytes de "padding" mis pour aligner moyenne sur une frontière de mot. Pour pallier à cet inconvénient, il suffit de mettre moyenne au début de la structure, cela devrait suffire.

De toute façon, les recommandations de codage de la FSF prescrivent bien de limiter l'utilisation de fprint() et de ses dérivés.

Poste le Monday 24 April 2006 19:27:40
Répondre     Citer    
Re: creation d'un fichier en langage c

Pas sûr pour le détail du double, il y a bien IEEE-754, mais un double peut être big-endian ou little-endian.

Par contre, tu m'as convaincu pour les aspects pédagogiques.... j'ai une faible expérience d'enseignement (et je voudrais bien enseigner encore).


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 24 April 2006 21:28:59
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: Sve@r

Citation
abgech
Tu parles de portabilité, c'est un point qui peut
se discuter. Avec la structure qui est proposée
plus haut:
struct s_eleve {
....char nom[21];
....char prenom[21];
....double moyenne;
};
il n'y a que moyenne qui ne serait pas portable,
et encore, j'utilise le conditionel à dessein:
actuellement les types "virgule flottante" sont
normalisés au niveau du matériel et peuvent
souvent être repris tels quels (ce n'est pas,
malheureusement, le cas des entiers). Dans le cas
précis, la seule chose qui pourrait poser des
problème de portabilité, c'est les bytes de
"padding" mis pour aligner moyenne sur une
frontière de mot. Pour pallier à cet inconvénient,
il suffit de mettre moyenne au début de la
structure, cela devrait suffire.

Je trouve la solution dangereuse (que faire si on a plusieurs doubles et float ???). Le pb d'alignement des mots est un vrai problème quand il faut exporter une structure (sur un fichier, un socket, un pipe, etc...).
J'ai proposé un exemple type de stockage comme le dit Basile, dans un simple format texte (printf) pour que le débutant puisse avoir la joie de voir son fichier se créer et puisse le vérifier avec un simple "cat". Mais si on veut stocker le fichier en binaire (évidemment moins gourmand en espace disque et en temps cpu), il vaut mieux utiliser un fwrite par membre plutôt qu'un fwrite pour la structure entière. Là, on s'affranchit des pb d'alignement...


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

Poste le Monday 1 May 2006 13:35:08
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: abgech

Citation
Sve@r
...
Je trouve la solution dangereuse (que faire si on a plusieurs doubles et float ???).
...
On classe, dans la structure, les types de données selon la taille de leur alignement, les plus grands alignements en premier, puis les autres: par exemple:
- Tous les double,
- Tous les float,
- Tous les long int,
- Tous les int,
- Tous les short int,
- Tous les char.

Remarque:
On n'évite toutefois pas les problème "big ou low endian".
Le mieux, c'est d'isoler les E/S dans une fonction, qui a comme paramètre la structure. Sur l'impémentation d'origine, la fonction ne fait que le fwrite() sur le paramètre. En cas de portage, et si c'est nécessaire, on adapte les formats dans la fonction.

Citation
Sve@r
...
il vaut mieux utiliser un fwrite par membre plutôt qu'un fwrite pour la structure entière.
...
AMHA, j'estime que cette solution, un peu "fouilli" va à l'encontre de la lisibilité du programme en multipliant les fwrite pour un seul accés logique.
Par exemple, imagine:
struct coord_s {double  x,
                double  y
               } point;

fwrite(point, sizeof(point), 1,fp);

Me paraît plus clair que:
fwrite(point.x, sizeof(point.x), 1,fp);
fwrite(point.y, sizeof(point.y), 1,fp);

Et encore, je n'ai mis que deux variables dans ma structure. Imagine s'il y en a une dizaine, cas fréquent des structures !

Poste le Tuesday 2 May 2006 19:53:58
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: Sve@r

Citation
abgech
AMHA, j'estime que cette solution, un peu
"fouilli" va à l'encontre de la lisibilité du
programme en multipliant les fwrite pour un seul
accés logique.
Par exemple, imagine:
struct coord_s {double x,
double y
} point;

fwrite(point, sizeof(point), 1,fp);

Me paraît plus clair que:
fwrite(point.x, sizeof(point.x), 1,fp);
fwrite(point.y, sizeof(point.y), 1,fp);

Et encore, je n'ai mis que deux variables dans ma
structure. Imagine s'il y en a une dizaine, cas
fréquent des structures !

Certes... mais si t'encapsules tous ces "fwrite" dans une grosse fonction E/S (comme tu l'as toi-même proposé) ???

C'est un peu l'éternel problème des solutions alternatives. Une solution va résoudre le pb mais se fera au détriment de la "logique" de la structure (si je veux stocker une date, je mets jj, mm, aa en fonction de ma logique et non du type de ces variables)
L'autre solution va résoudre le pb mais se fera au détriment de la lisibilité et de la "légèreté" du code

Ensuite, c'est une question de compromis...

PS: T'as oublié les "&"
fwrite(&point.x, sizeof(point.x), 1,fp);
fwrite(&point.y, sizeof(point.y), 1,fp);
;-)

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

Poste le Tuesday 2 May 2006 21:06:32
Répondre     Citer    
Re: creation d'un fichier en langage c
Envoyé par: abgech

Citation
Sve@r
...
PS: T'as oublié les "&"
fwrite(&point.x, sizeof(point.x), 1,fp);
fwrite(&point.y, sizeof(point.y), 1,fp);
...

Pan sur le bec ! À juste titre.

Poste le Wednesday 3 May 2006 08:36:52
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
creation d'un fichier en langage 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