fopen()

fopen() - C - Programmation

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  

Code :
  1. FILE *fichier;
  2. fichier = fopen("toto.txt", "r" );

Reply

Marsh Posté le 14-05-2005 à 19:47:06   

Reply

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

Reply

Marsh Posté le 14-05-2005 à 19:58:01    

ben pareil que Taz  [:airforceone]


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 14-05-2005 à 20:10:03    

blastman a écrit :

ben pareil que Taz  [:airforceone]


En pensant à retirer le '\n' ...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-05-2005 à 21:44:09    

comment acceper un argument en ligne de commande ?
sinon j'ai essayé ca mais ...

Code :
  1. #include <stdio.h>
  2. #include <string.h>   
  3. #include <stdlib.h>   
  4. main() {
  5.      
  6.     FILE *Fichier;
  7.     char local[80];
  8.     char text[80];
  9.     printf("entrer le nom du fichier à afficher:" );
  10.     Fichier = fopen(fgets( local, sizeof(local), stdin), "r" );
  11.     /* lecture d'une chaine */
  12.     fgets( text, sizeof(text), Fichier);
  13.     printf("%s", text);
  14.     fclose(Fichier);
  15.     return 0;
  16. }


Message édité par d'jo le 14-05-2005 à 22:06:53
Reply

Marsh Posté le 14-05-2005 à 22:10:29    

Segmentation fault....

Reply

Marsh Posté le 14-05-2005 à 22:12:26    

d'jo a écrit :

comment acceper un argument en ligne de commande ?
sinon j'ai essayé ca mais ...


    char local[80];
    printf("entrer le nom du fichier à afficher:" );
    Fichier = fopen(fgets( local, sizeof(local), stdin), "r" );




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.


Message édité par Emmanuel Delahaye le 14-05-2005 à 22:13:22

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 !!


Message édité par d'jo le 14-05-2005 à 22:21:12
Reply

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 ??


Message édité par d'jo le 14-05-2005 à 22:25:57
Reply

Marsh Posté le 14-05-2005 à 22:23:49   

Reply

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...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-05-2005 à 23:51:10    

Quelle astuce utiliser then ...

Reply

Marsh Posté le 15-05-2005 à 07:19:45    

d'jo a écrit :

Quelle astuce utiliser then ...



char buf[...]
fgets(buf,...)
/* virer le '\n' (j'ai donne la méthode 4000 fois) */
fopen(buf,...)


Message édité par Emmanuel Delahaye le 15-05-2005 à 07:20:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-05-2005 à 12:10:16    

Emmanuel Delahaye a écrit :


char buf[...]
fgets(buf,...)
/* virer le '\n' (j'ai donne la méthode 4000 fois) */
fopen(buf,...)



 
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 :
  1. #include <stdio.h>
  2. #include <string.h>   
  3. #include <stdlib.h>   
  4. int main() {
  5.      
  6. FILE *Fichier;
  7. char nom_fichier[80];
  8. char text[80];
  9.     printf("entrer le nom du fichier à afficher : " );
  10.     fgets(nom_fichier,sizeof(nom_fichier),stdin);
  11. char *backSn=strchr(nom_fichier, '\n');
  12.     if (backSn !=NULL) { *backSn=0; }
  13.     else {
  14.      Fichier = fopen(nom_fichier, "r" );
  15.       if ( Fichier  == NULL)
  16.         {
  17.          perror("fopen en lecture" );
  18.          exit(1);
  19.         }
  20.       fgets( text, sizeof(text), Fichier);
  21.       printf("%s", text);
  22.      fclose(Fichier);
  23.     }
  24.     return 0;
  25. }


Message édité par d'jo le 15-05-2005 à 12:19:26
Reply

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:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
static int clean (char *buf, FILE * fp)
{
   int err = 0;
   char *p = strchr (buf, '\n');
 
   if (p != NULL)
   {
      *p = 0;
   }
   else
   {
      int c;
      while ((c = fgetc (fp)) != '\n' && c != EOF)
      {
      }
      err = 1;
   }
   return err;
}
 
 
int main (void)
{
   char nom_fichier[80];
 
   printf ("entrer le nom du fichier à afficher : " );
   fgets (nom_fichier, sizeof nom_fichier, stdin);
   clean (nom_fichier, stdin);
 
   {
      FILE *Fichier = fopen (nom_fichier, "r" );
 
      if (Fichier != NULL)
      {
         char text[60];
 
         while (fgets (text, sizeof (text), Fichier) != NULL)
         {
            int err = clean (text, Fichier);
 
            printf ("%s", text);
 
            if (err)
            {
               printf ("[...]" );
            }
            printf ("\n" );
         }
         fclose (Fichier);
      }
      else
      {
         perror (nom_fichier);
      }
   }
   return 0;
}


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-05-2005 à 12:36:42    

si fgets échoue, tu l'as dans l'os

Reply

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 ??


Message édité par d'jo le 15-05-2005 à 13:15:55
Reply

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 ....


Message édité par blastman le 15-05-2005 à 13:32:25

---------------
http://www.blastmanu.info
Reply

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.


Message édité par Tarabiscote le 15-05-2005 à 13:37:28
Reply

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 :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. void clean (char *buf)
  5. {
  6.    char *p = strchr (buf, '\n');
  7.    if (p != NULL)
  8.    {
  9.       *p = 0;
  10.    }
  11.    else {}
  12. }
  13. int main (void)
  14. {
  15.    char nom_fichier[80];
  16.    printf ("entrer le nom du fichier à afficher : " );
  17.    fgets (nom_fichier, sizeof nom_fichier, stdin);
  18.    clean (nom_fichier);
  19.    {
  20.       FILE *Fichier = fopen (nom_fichier, "r" );
  21.       if (Fichier != NULL)
  22.       {
  23.          char text[60];
  24.          while (fgets (text, sizeof (text), Fichier) != NULL)
  25.          {
  26.             printf ("%s", text); 
  27.          }
  28.          fclose (Fichier);
  29.       }
  30.       else
  31.       {
  32.          perror (nom_fichier);
  33.       }
  34.    }
  35.    return 0;
  36. }

Reply

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 :)

Reply

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:

void clean (char *buf)  
{  
   char *p = strchr (buf, '\n');  
 
   if (p != NULL)  
   {  
      *p = 0;  
   }  
   else {}
}  



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 :

 

        char text[60];  
 
         while (fgets (text, sizeof (text), Fichier) != NULL)  
         {
            printf ("%s", text);  
         }  



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


int c;
 
while ((c = fgetc(Fichier)) != EOF)
{
   putchar (c);
}
fflush (stdout);


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


Message édité par Emmanuel Delahaye le 15-05-2005 à 15:50:11

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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

Reply

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 :
  1. struct fiche {
  2.      
  3.        char nom[N];
  4.        char prenom[N];
  5.        char adresse[N];
  6.      
  7.        };
  8. [...]
  9. int main()
  10. {
  11. [...]
  12. /*quelque chose dans le style*/
  13. fgets(nom_client,sizeof(nom_client),&personne.nom);

Reply

Marsh Posté le 15-05-2005 à 17:08:56    

strncpy(nom_client, personne.nom, sizeof nom_client);

Reply

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.

Code :
  1. struct fiche {
  2.      
  3.        char nom[N];
  4.        char prenom[N];
  5.        char adresse[N];
  6.      
  7.        };
  8. [...]
  9. int main()
  10. {
  11. [...]
  12. /*quelque chose dans le style*/
  13. fgets(nom_client,sizeof(nom_client),&personne.nom);



??? 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);


Message édité par Emmanuel Delahaye le 15-05-2005 à 17:48:55

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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


Message édité par d'jo le 15-05-2005 à 21:35:20
Reply

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
ex : on entre : dupont jacques esbly => on enregistre dans un fichier text qui se nomme automatiquement dupont.txt


A partir du nom, on construit une chaine avec sprintf(), et on la passe a fopen(). fgets() n'a rien à voir là dedans !


Message édité par Emmanuel Delahaye le 15-05-2005 à 21:44:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 :
  1. [...]
  2. FILE * Fichier
  3. char nom_fichier[80];
  4. nom_fichier=sprintf(personne.nom)
  5. Fichier=fopen(nom_fichier.txt,"r" )


par exemple ?


Message édité par d'jo le 15-05-2005 à 21:58:15
Reply

Marsh Posté le 15-05-2005 à 21:58:39    

nom_fichier.txt je ne pense pas que j'ai le droit ...


Message édité par d'jo le 15-05-2005 à 21:59:04
Reply

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

Reply

Marsh Posté le 15-05-2005 à 22:29:19    

strncpy fonctionne impek

Reply

Marsh Posté le 15-05-2005 à 22:48:39    

non

Reply

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);


Message édité par Tarabiscote le 15-05-2005 à 23:17:39
Reply

Marsh Posté le 15-05-2005 à 23:17:13    

on a pas banni strncpy, seulement l'usage que tu en proposes est catastrophique.

Reply

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.

Reply

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 ...

Reply

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, s’il n’y 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.
 
       Dans le cas où la longueur src est inférieure à n, la fin de dest sera remplie avec des caractères nuls.

Reply

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 d’avoir une piste.  :jap:


Message édité par Tarabiscote le 15-05-2005 à 23:47:46
Reply

Marsh Posté le 16-05-2005 à 06:24:48    

d'jo a écrit :

Ok comme :

Code :
  1. [...]
  2. FILE * Fichier
  3. char nom_fichier[80];
  4. nom_fichier=sprintf(personne.nom)
  5. Fichier=fopen(nom_fichier.txt,"r" )




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"


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed