Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2418 connectés 

  FORUM HardWare.fr
  Programmation
  C

  fopen()

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

fopen()

n°1083523
d'jo
Posté le 14-05-2005 à 19:47:06  profilanswer
 

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

mood
Publicité
Posté le 14-05-2005 à 19:47:06  profilanswer
 

n°1083526
Taz
bisounours-codeur
Posté le 14-05-2005 à 19:50:28  profilanswer
 

utilise fgets pour la saisie du nom du fichier, ou bien accepte un argument en ligne de commande

n°1083528
blastman
just me !
Posté le 14-05-2005 à 19:58:01  profilanswer
 

ben pareil que Taz  [:airforceone]


---------------
http://www.blastmanu.info
n°1083533
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-05-2005 à 20:10:03  profilanswer
 

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/
n°1083571
d'jo
Posté le 14-05-2005 à 21:44:09  profilanswer
 

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
n°1083609
d'jo
Posté le 14-05-2005 à 22:10:29  profilanswer
 

Segmentation fault....

n°1083611
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-05-2005 à 22:12:26  profilanswer
 

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/
n°1083620
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-05-2005 à 22:15:08  profilanswer
 

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/
n°1083631
d'jo
Posté le 14-05-2005 à 22:19:48  profilanswer
 

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
n°1083640
d'jo
Posté le 14-05-2005 à 22:23:49  profilanswer
 

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
mood
Publicité
Posté le 14-05-2005 à 22:23:49  profilanswer
 

n°1083720
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-05-2005 à 22:51:32  profilanswer
 

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/
n°1083835
d'jo
Posté le 14-05-2005 à 23:51:10  profilanswer
 

Quelle astuce utiliser then ...

n°1083912
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-05-2005 à 07:19:45  profilanswer
 

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/
n°1084030
d'jo
Posté le 15-05-2005 à 12:10:16  profilanswer
 

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
n°1084061
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-05-2005 à 12:33:52  profilanswer
 

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/
n°1084064
Taz
bisounours-codeur
Posté le 15-05-2005 à 12:36:42  profilanswer
 

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

n°1084090
d'jo
Posté le 15-05-2005 à 13:14:44  profilanswer
 

[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
n°1084105
blastman
just me !
Posté le 15-05-2005 à 13:30:43  profilanswer
 

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
n°1084108
Tarabiscot​e
Posté le 15-05-2005 à 13:34:33  profilanswer
 

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
n°1084211
d'jo
Posté le 15-05-2005 à 15:05:14  profilanswer
 

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

n°1084234
Tarabiscot​e
Posté le 15-05-2005 à 15:30:07  profilanswer
 

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

n°1084259
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-05-2005 à 15:48:36  profilanswer
 

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/
n°1084274
d'jo
Posté le 15-05-2005 à 16:13:56  profilanswer
 

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

n°1084333
d'jo
Posté le 15-05-2005 à 17:04:41  profilanswer
 

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

n°1084336
Tarabiscot​e
Posté le 15-05-2005 à 17:08:56  profilanswer
 

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

n°1084391
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-05-2005 à 17:48:13  profilanswer
 

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/
n°1084760
d'jo
Posté le 15-05-2005 à 21:34:26  profilanswer
 

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
n°1084765
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-05-2005 à 21:44:08  profilanswer
 

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/
n°1084770
d'jo
Posté le 15-05-2005 à 21:57:31  profilanswer
 

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
n°1084771
d'jo
Posté le 15-05-2005 à 21:58:39  profilanswer
 

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


Message édité par d'jo le 15-05-2005 à 21:59:04
n°1084773
Taz
bisounours-codeur
Posté le 15-05-2005 à 22:00:18  profilanswer
 

Tarabiscote a écrit :

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


bonjour le carton ...
http://forum.hardware.fr/forum2.ph [...] ash_post=0

n°1084805
d'jo
Posté le 15-05-2005 à 22:29:19  profilanswer
 

strncpy fonctionne impek

n°1084840
Taz
bisounours-codeur
Posté le 15-05-2005 à 22:48:39  profilanswer
 

non

n°1084880
Tarabiscot​e
Posté le 15-05-2005 à 23:15:20  profilanswer
 

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
n°1084885
Taz
bisounours-codeur
Posté le 15-05-2005 à 23:17:13  profilanswer
 

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

n°1084899
Tarabiscot​e
Posté le 15-05-2005 à 23:24:36  profilanswer
 

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.

n°1084900
Taz
bisounours-codeur
Posté le 15-05-2005 à 23:26:26  profilanswer
 

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

n°1084902
Taz
bisounours-codeur
Posté le 15-05-2005 à 23:27:36  profilanswer
 

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.

n°1084911
Tarabiscot​e
Posté le 15-05-2005 à 23:35:53  profilanswer
 

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
n°1085002
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-05-2005 à 06:24:48  profilanswer
 

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/
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  fopen()

 

Sujets relatifs
Php avec glob / fopenfopen ne reconnait pas un fichier existant
fopen ou readfileProblème d'ouverture d'url avec fopen()
fopen et son handlefopen et parametre variable
fopen... fread... fwrite...gestion de contenu via fopen
fopen et open sont dans un bateau...Petit pb simple de chemin pour un fopen
Plus de sujets relatifs à : fopen()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR