fopen() - C - Programmation
Marsh Posté le 14-05-2005 à 19:50:28
utilise fgets pour la saisie du nom du fichier, ou bien accepte un argument en ligne de commande
Marsh Posté le 14-05-2005 à 19:58:01
ReplyMarsh Posté le 14-05-2005 à 20:10:03
blastman a écrit : ben pareil que Taz |
En pensant à retirer le '\n' ...
Marsh Posté le 14-05-2005 à 21:44:09
comment acceper un argument en ligne de commande ?
sinon j'ai essayé ca mais ...
Code :
|
Marsh Posté le 14-05-2005 à 22:12:26
d'jo a écrit : comment acceper un argument en ligne de commande ?
|
J'avais pourtant bien dit qu'il fallait supprimmer le '\n'...
http://forum.hardware.fr/forum2.ph [...] 4#t1083533
Je parle aux murs ou quoi ?
http://mapage.noos.fr/emdel/notes.htm#fichiers
D'autre part, fopen() peut échouer (la preuve). Il faut donc tester le FILE* avant de l'utiliser.
Marsh Posté le 14-05-2005 à 22:15:08
d'jo a écrit : comment acceper un argument en ligne de commande ? |
Je rappelle que l'autre forme correcte de main() est:
int main (int arc, char **argv) |
Pour l'utilisation des paramètres je te renvoi à ton livre de C...
Marsh Posté le 14-05-2005 à 22:19:48
oki c'est bon pour le test mais pour le /n non encore une fois.. je pensais que tu pourrais me reexpliquer la facon de l'enlever...Monsieur Delahaye merci
Pour le main... je n'ai pas appris ca du tout !!
Marsh Posté le 14-05-2005 à 22:23:49
C'est bon je l'ai trouvé sur tes cours merci.
Ok je l'ai compris mais comment l'utiliser ici puisque je suis deja dans fopen ??
Marsh Posté le 14-05-2005 à 22:51:32
d'jo a écrit : Ok je l'ai compris mais comment l'utiliser ici puisque je suis deja dans fopen ?? |
Jutement, il ne faut pas imbriquer les appels f(g()), sinon, on ne contrôle rien...
Marsh Posté le 15-05-2005 à 07:19:45
d'jo a écrit : Quelle astuce utiliser then ... |
|
Marsh Posté le 15-05-2005 à 12:10:16
Emmanuel Delahaye a écrit :
|
J'ai donc modifié le programme il n'y a pas d'erreur de compilation mais il n'affiche pas le fichier?? Vois tu l'erreur
Code :
|
Marsh Posté le 15-05-2005 à 12:33:52
d'jo a écrit : J'ai donc modifié le programme il n'y a pas d'erreur de compilation mais il n'affiche pas le fichier?? Vois tu l'erreur |
Oui, l'algo est faux. La presence ou du '\n' nous renseigne sur le tronquage eventuel, par sur la validité de la chaine lue.
Essaye ça et pose des questions si tu ne comprends pas:
|
Marsh Posté le 15-05-2005 à 13:14:44
[quotemsg]
Essaye ça et pose des questions si tu ne comprends pas:
[quotemsg]
Ok j'ai compris le programme , mais deux suptilités d'écriture que je ne connais pas :
Le " static int clean" à quoi sert le static
et le "if (err)" -> il n'y a pas de conditions ??
Marsh Posté le 15-05-2005 à 13:30:43
le mot clef static sert à ce que la valeur de la variable n'est pas perdue lors de la sortie du bloc.
(elle est réutilisable à la prochaine entrée le bloc)
la condition est: si (err est vrai) alors faire ....
Marsh Posté le 15-05-2005 à 13:34:33
Enfin dans ce cas là c'est la fonction qui est static autrement dit elle n'est pas visible dans d'autre unités de translations (d'autre .c si vous préférez).
PS : Ta définition n'est pas celle de "static" mais tu définis plutôt ce qui n'est pas "auto", ce n'est pas la même chose.
Marsh Posté le 15-05-2005 à 15:05:14
J'ai simplifier le programme peux tu me dire les eventuels défault ou limites créée par cette modif:
Code :
|
Marsh Posté le 15-05-2005 à 15:30:07
Tu as juste enlevé une partie de la gestion d'erreur (bon elle n'était pas complète mais ...).
Et tu as mis clean dans l'espace de nommage, alors là ça peut servir si tu veux l'utiliser autre part, mais il faut savoir que :
- si tu en crées une autre dans un autre fichier, tu auras des problèmes.
- et le compilateur n'optimisera pas de la même façon.
Résultat je vois pas où ton code est plus clair (c'est pas 16 malheureuses petites lignes en moins qui gâchent la clarté du programme), tu gères moins d'erreurs, ton programme sera plus gros et plus lent...
Pas mal comme modification
Marsh Posté le 15-05-2005 à 15:48:36
d'jo a écrit : J'ai simplifier le programme peux tu me dire les eventuels défault ou limites créée par cette modif:
|
Ca dépend de de ce que tu veux faire.
fgets() sert à lire des lignes de texte. On passe a fgets() l'adresse du tableau de char et sa taille. fgets() se débrouille pour lire autant de caractères qu'il peut. Si il il ne peut pas (limitation de taille), il arrête la lecture a [taille-2] et place un 0 en [taille-1]. La ligne est donc incomplète, et par conséquent, le '\n' n'est pas dans le tableau.
Maintenant, coté utilisateur, on vérifie si fgets() a placé le '\n' dans le tableau. Si il y est, on le supprimme (en général, c'est plus génant qu'autre chose). Si il n'y est pas, soit on ne fait rien (ce que tu as fait), et le prochain fgets() va lire les caractères restants (sans suspendre l'exécution si c'est sur stdin), soit on décide de purger les caractères restant, et on les lit (sans les stocker) jusqu'à tomber sur le '\n' ou la fin de fichier.
Tu fais tes choix en connaissance de cause.
Citation :
|
Ok, tu vas lire toutes les caractères sans tenir compte de la structure de ligne. C'est une façon compliquée d'écrire
|
Dans les deux cas, le fflush(stdout) est conseillé, car il n'est pas garanti que la dernière ligne soit complète.
http://mapage.noos.fr/emdel/notes.htm#fflush_stdout
Marsh Posté le 15-05-2005 à 16:13:56
Oki bon je pense que pour mon utilisation ca devrait suffir,
je souhaite juste afficher le texte contenu dans le fichier demandé.
merci encore une fois
Marsh Posté le 15-05-2005 à 17:04:41
Dernier petit souci avec fgets , je souhaiterai faire passer en 3eme argument un nom entré precedement dans une structure.
Code :
|
Marsh Posté le 15-05-2005 à 17:48:13
d'jo a écrit : Dernier petit souci avec fgets , je souhaiterai faire passer en 3eme argument un nom entré precedement dans une structure.
|
??? Le troisième argument de fgets() est un FILE * (flux ouvert en lecture) et rien d'autre. Ce que tu as écrit n'a aucun sens. Tu veux faire quoi exactement ? Ca ?
fgets (personne.nom, sizeof personne.nom, stdin); |
Marsh Posté le 15-05-2005 à 21:34:26
Non en fait je souhaite prend le nom de la personne pour nommer le fichier creer
ex : on entre : dupont jacques esbly => on enregistre dans un fichier text qui se nomme automatiquement dupont.txt
Marsh Posté le 15-05-2005 à 21:44:08
d'jo a écrit : Non en fait je souhaite prend le nom de la personne pour nommer le fichier creer |
A partir du nom, on construit une chaine avec sprintf(), et on la passe a fopen(). fgets() n'a rien à voir là dedans !
Marsh Posté le 15-05-2005 à 21:57:31
Emmanuel Delahaye a écrit : A partir du nom, on construit une chaine avec sprintf(), et on la passe a fopen(). fgets() n'a rien à voir là dedans ! |
Ok comme :
Code :
|
par exemple ?
Marsh Posté le 15-05-2005 à 21:58:39
nom_fichier.txt je ne pense pas que j'ai le droit ...
Marsh Posté le 15-05-2005 à 22:00:18
Tarabiscote a écrit : strncpy(nom_client, personne.nom, sizeof nom_client); |
bonjour le carton ...
http://forum.hardware.fr/forum2.ph [...] ash_post=0
Marsh Posté le 15-05-2005 à 23:15:20
Je me demandai si quelqu'un m'avait remarqué
Taz : Désolé, je savais pas que strncpy avait été banni d'ici.
d'jo : je sais pas ce que tu compte en faire par la suite, mais n'oublie pas de rajouter un 0 à la fin si tu l'utilise comme chaîne de caractère.
Sinon si "nom_client" et "personne.nom" font la même taille et que tu es sûr d'avoir un 0 à la fin de "personne.nom" alors tu peux aussi faire :
strcpy(nom_client, personne.nom);
Marsh Posté le 15-05-2005 à 23:17:13
on a pas banni strncpy, seulement l'usage que tu en proposes est catastrophique.
Marsh Posté le 15-05-2005 à 23:24:36
Je vois toujours pas ce que tu veux dire...
Je dois être bête ou alors tu ne lis pas mes posts, je sais pas.
Marsh Posté le 15-05-2005 à 23:26:26
lis la documentation de strncpy, que veut tu que je te dises ...
c'est pas la peine de pleurer 'je savais que strncpy avait été banni' si tu lis pas les explications ...
Marsh Posté le 15-05-2005 à 23:27:36
en gros, RTFM
Citation : La fonction strncpy() est identique, sauf que seuls les n premiers octets de src sont copiés. Ainsi, sil ny a pas de caractère nul dans les n premiers octets de src, la chaîne résultante ne disposera de caractère nul final. |
Marsh Posté le 15-05-2005 à 23:35:53
Mais tu parles de quoi, strncpy sert à remplir un "buffer" en commencent par le remplir par la chaîne puis en finissant par des zéros si le "buffer" n'est pas encore plein (je dit buffer et pas chaîne car le traitement que j'en fait n'est pas le même).
Après si on veut on peut le "converti" en "chaîne" en mettant un zéro à la fin. (c'est tout ce que je vois qui peut te choquer mais j'en ai parlé précédemment)
EDIT : d'après ton message précédent il semblerait que ce soit ça alors ? Eh ben ...
Et voilà je vois rien de plus.
Donc si y a un problème je suis toujours prêt à corriger mes erreurs mais ça serait bien davoir une piste.
Marsh Posté le 16-05-2005 à 06:24:48
d'jo a écrit : Ok comme :
|
Il faut arréter de coder au hasard et lire la doc de fonctions avant de poster n'importe quoi en espérant qu'un pigeon de passage te mettra le bon code à la place.
google "man sprintf"
Marsh Posté le 14-05-2005 à 19:47:06
Bonjour
Je souhaite faire passer en argument de fopen le nom d'un fichier
que l'utilisateur entrerai (ici à la place de toto.txt) .
Comment le faire rentrer ??? Si quelqu'un peut m'aider merci