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

  FORUM HardWare.fr
  Programmation
  C

  fopen et parametre variable

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fopen et parametre variable

n°817239
Athlon2x
Posté le 07-08-2004 à 20:15:41  profilanswer
 

Salut,  
 
pourriez vous m'expliquer comment faire pour utiliser la fonction fopen comme ca : (biensur ce code ne fonctionne pas)
 

Code :
  1. printf("Fichier à copier : " );
  2.         scanf("""%s""", &a);
  3. fsource = fopen(a, "r" );
  4.                 if(fsource == NULL)
  5.                 printf("Probleme ouverture fichier source" );


 
J'espere que vous comprenez ma question ... pas facile à expliquer.
 
Rappel : d'habitude fopen est utilisé comme ceci :
 

Code :
  1. fopen("monficher", "modeouverture" );


 
Moi je souhaite remplacer " "monfichier" " par une variable.
 
Merci  :p

mood
Publicité
Posté le 07-08-2004 à 20:15:41  profilanswer
 

n°817241
madprog
Posté le 07-08-2004 à 20:22:42  profilanswer
 

bah si a est un char *, ca devrait marcher (enfin la, il faut que ce soit un tableau initialisé et tout, et qu'il fasse une taille suffisante pour que la chaine tapée entre dedans...)
 
c'est le probleme avec scanf, c'est assez sensible au buffer overflow


Message édité par madprog le 07-08-2004 à 20:23:30
n°817248
Athlon2x
Posté le 07-08-2004 à 20:34:00  profilanswer
 

c'est initialisé comme ca :
 

Code :
  1. FILE *fsource, *fcopy;
  2.         char a,b,c,d,;
  3.        
  4.         printf("Fichier à copier : " );
  5.         scanf("""%s""", &a);


 
je debute donc je ne comprend pas tout ce que tu ecris ;)

n°817249
Athlon2x
Posté le 07-08-2004 à 20:37:27  profilanswer
 

comme erreur a la compilation j'ai : invalid conversion
 
:(

n°817259
antp
Super Administrateur
Champion des excuses bidons
Posté le 07-08-2004 à 20:49:04  profilanswer
 

- À quoi servent tous ces guillemets ? ("""%s""" )
- char = 1 caractère ; pour une chaîne c'est char * et il faut l'initialiser avec malloc (par exemple)
- j'utiliserais fgets plutôt que scanf ; elle permet de donner une longueur maximale (la taille allouée)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°817271
Athlon2x
Posté le 07-08-2004 à 21:21:05  profilanswer
 

tout ces guillemets c'est pour que la variable soit remplacée par "cheminfichier"  avec les guillemets. (peut etre qu'il ne faut pas faire comme ca ?)
 
pour char je suis ok mais peux tu m'expliquer un peu plus cette histoire de char * et malloc ...
 
pour fgets ou scanf, le chemin du fichier ou la taille du nom peut grandement varier par conséquent scanf me parait plus approprié. (enfin je me plante peut etre encore ;) je debute :P)
 

n°817273
antp
Super Administrateur
Champion des excuses bidons
Posté le 07-08-2004 à 21:32:31  profilanswer
 

"\"%s\""
 
un \ devant un " pour qu'il soit tel quel dans la chaîne
 
Mais je ne vois pas trop pourquoi il faut des guillemets là :??:
 
Si tu ne connais pas malloc et les char * il faudrait quand même relire les bases du C.
Vu que ta variable a toujours une taille limitée, il vaut mieux que tu puisses dire à la fonction quelle taille elle a. Avec scanf si l'utilisateur entre plus de texte que prévu... boum :D
 
char *ficname;
 
ficname = malloc(MAX_PATH);
fgets(ficname, MAX_PATH, stdin);
 
si MAX_PATH n'existe pas, tu peux mettre 260.


Message édité par antp le 07-08-2004 à 21:33:07

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°817274
Athlon2x
Posté le 07-08-2004 à 21:42:06  profilanswer
 

char * je connaissait mais pas sous cette appelation ... quant a malloc, ca ne fait pas partie de mes bases de C ;)
 
ta raison pour les guillemets,je n'en ai pas besoin :)

n°817275
Athlon2x
Posté le 07-08-2004 à 21:46:13  profilanswer
 

comment veux tu que je connaisse la taille max de la chaine dont j'ai besoin ??
 
imagine que j'ouvre le fichier
 
c:\documents and settings\jai au moins un nom et un prenom long comme ca\bureau\mon nom de dossier alacon\mon nom de ficher
 
Comment je fais ??

n°817276
farib
Posté le 07-08-2004 à 21:55:48  profilanswer
 

Athlon2x a écrit :

comment veux tu que je connaisse la taille max de la chaine dont j'ai besoin ??
 
imagine que j'ouvre le fichier
 
c:\documents and settings\jai au moins un nom et un prenom long comme ca\bureau\mon nom de dossier alacon\mon nom de ficher
 
Comment je fais ??


 
 
/home/farib/dossier_a_la_con
 
 
merci, grandissime XP, de simplifier le monde !


---------------
Bitcoin, Magical Thinking, and Political Ideology
mood
Publicité
Posté le 07-08-2004 à 21:55:48  profilanswer
 

n°817278
Athlon2x
Posté le 07-08-2004 à 22:00:59  profilanswer
 

ct un exemple pfff ....

n°817284
Sve@r
Posté le 07-08-2004 à 22:17:09  profilanswer
 

Tu es obligé de stocker le nom du fichier dans une variable avant de l'ouvrir.
Si tu ne connais pas la taille de ce nom, tu ne peux qu'extrapoler qu'il ne dépassera pas une certaine taille, par exemple 1024 octets, et programmer en conséquence
 
Par exemple

Code :
  1. #define SIZENOM    (1024)
  2. char nomFic[SIZENOM + 1];
  3. FILE *fp;
  4. fgets(nomFic, SIZENOM + 1, stdin);
  5. fp=fopen(nomFic, "r" );
  6. ...


 
L'avantage de cette méthode est que si 1024 n'est pas bon (trop ou pas assez), tu le modifies dans le "#define" et tu recompiles. Tout le reste suit en conséquence.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°817286
antp
Super Administrateur
Champion des excuses bidons
Posté le 07-08-2004 à 22:22:48  profilanswer
 

D'où le MAX_PATH qui contient la taille max du chemin et qu'il vaut mieux utiliser plutôt que de taper une valeur arbitraire.
Sous Windows, c'est 256 caractères pour les dossiers et le fichier, en général MAX_PATH vaut 260 (3 de plus pour la lettre du disque et le ":\", et 1 pour le zéro final).
Tu ne pourras pas avoir de chemin plus long, c'est une limite de l'OS.


Message édité par antp le 07-08-2004 à 22:24:16

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°817289
antp
Super Administrateur
Champion des excuses bidons
Posté le 07-08-2004 à 22:25:09  profilanswer
 

Athlon2x a écrit :

char * je connaissait mais pas sous cette appelation ... quant a malloc, ca ne fait pas partie de mes bases de C ;)


 
Mauvaises bases... Faut en trouver d'autres


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°817298
madprog
Posté le 07-08-2004 à 22:52:46  profilanswer
 

farib a écrit :

/home/farib/dossier_a_la_con
 
 
merci, grandissime XP, de simplifier le monde !


:lol: farib (t'es celui que je connais ?)

n°817307
Athlon2x
Posté le 07-08-2004 à 23:33:52  profilanswer
 

oki doki je vous remercie tous ;)

n°817360
Taz
bisounours-codeur
Posté le 08-08-2004 à 02:10:41  profilanswer
 

printf("Fichier à copier : " );
          scanf("""%s""", &a);
 
 
-> printf(); fflush(stdout); fgets
 
 
sinon on (et j'ai) a donné 100x le code de getline (si non présent sur ton système)
 
 
 
antp: je t'y prends à faire des allocations dynamiques de taille statique :o


Message édité par Taz le 08-08-2004 à 10:45:45
n°817419
antp
Super Administrateur
Champion des excuses bidons
Posté le 08-08-2004 à 11:15:28  profilanswer
 

Taz a écrit :


antp: je t'y prends à faire des allocations dynamiques de taille statique :o


 
:whistle:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1079271
bipeuh
Posté le 11-05-2005 à 12:53:14  profilanswer
 

Et ça, ça marche ou pas?? DATA[i], L et NB_FILE sont des variables globales.
 
FILE *fp;
int i;
char nomFichier[50];
char tmp1[2];
 
sprintf(nomFichier,"/home/admin/DATA" );  
sprintf(tmp1,"%02d",NB_FILE);
 
strcat(nomFichier,tmp1);
 
fp=fopen(nomFichier, "a" );
for (i=0;i<=L;i++) fprintf(fp,"%d\t%d\n",i,DATA[i]);
fclose(fp);

n°1079299
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2005 à 13:26:13  profilanswer
 

Athlon2x a écrit :

pourriez vous m'expliquer comment faire pour utiliser la fonction fopen comme ca

Code :
  1. printf("Fichier à copier : " );
  2.         scanf("""%s""", &a);
  3. fsource = fopen(a, "r" );
  4.                 if(fsource == NULL)
  5.                 printf("Probleme ouverture fichier source" );




Comment est défini 'a' ?
D'autre part, je trouve qu'il y a beaucoup de '"' dans ta chaine.  Ton code est équivallent à :

  scanf("%s", &a);



---------------
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°1079300
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2005 à 13:26:51  profilanswer
 

madprog a écrit :

bah si a est un char *, ca devrait marcher (enfin la, il faut que ce soit un tableau initialisé et tout, et qu'il fasse une taille suffisante pour que la chaine tapée entre dedans...)
 
c'est le probleme avec scanf, c'est assez sensible au buffer overflow


En plus, si le char* n'a pas été initialisé...
 


---------------
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°1079310
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2005 à 13:31:48  profilanswer
 

Athlon2x a écrit :

c'est initialisé comme ca :

Code :
  1. FILE *fsource, *fcopy;
  2.         char a,b,c,d,;
  3.        
  4.         printf("Fichier à copier : " );
  5.         scanf("""%s""", &a);




avec un seul char (a), tu ne pas entrer autre chose qu'un 0 (chaine vide ou  "" ). D'autre part, à quoi servent b, c, d ? Il faut un tableau de char d'une taille suffisante. D'autre part, l'utilisation de scanf() est déconseillée, surtout aux débutants (trop complexe, trop dangereux). Je recommande fgets() avec la manip qui va bien pour supprimmer le '\n' final de la chaine saisie.
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers

Citation :

je debute donc je ne comprend pas tout ce que tu ecris


Il faudrait peut être commencer par apprendre les choses dans l'ordre...
 
http://www.dunod.com/pages/ouvrage [...] p?id=48734


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

---------------
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°1079589
bipeuh
Posté le 11-05-2005 à 15:20:16  profilanswer
 

désolé, j'avais pas bien réfléchi... voilà qui va mieux :D  
 

Spoiler :

/#FILE *fp;
char nomFichier[50];
int i;
 
sprintf(nomFichier,"/home/admin/DATA%02d",NB_FILE);
 
fp=fopen(nomFichier, "a" );
for (i=0;i<=L;i++) fprintf(fp,"%d\t%d\n",i,DATA[i]);
fclose(fp);


 
 

n°1079601
skelter
Posté le 11-05-2005 à 15:27:08  profilanswer
 

Code :
  1. char nomFichier[50];
  2. char tmp1[2];
  3. sprintf(nomFichier,"/home/admin/DATA" ); 
  4. sprintf(tmp1,"%02d",NB_FILE);
  5. strcat(nomFichier,tmp1);


 
autant ecrire
 

Code :
  1. char nomFichier[500];
  2. sprintf(nomFichier,"/home/admin/DATA%2d", NB_FILE );

n°1079857
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-05-2005 à 17:39:37  profilanswer
 

Sve@r a écrit :


Code :
  1. #define SIZENOM    (1024)
  2. char nomFic[SIZENOM + 1];
  3. FILE *fp;
  4. fgets(nomFic, SIZENOM + 1, stdin);
  5. fp=fopen(nomFic, "r" );
  6. ...




Marche pas. Il faut éliminer le '\n'.
 
Extrait de  
http://mapage.noos.fr/emdel/notes.htm#fichiers


   {
      /* chercher le '\n' */
      char *p = strchr(ligne, '\n');
 
      if (p != NULL)
      {
         /* si on l'a trouve, on l'elimine. */
         *p = 0;
      }
      else
      {
         /* Le traitement depend de l'application.
          * Par exemple, ici, on choisi d'ignorer
          * les autres caracteres.
          */
 
         /* sinon, on lit tous les caracteres restants */
         int c;
 
         while ((c = fgetc(fp)) != '\n' && c != EOF)
         {
         }
      }
   }


 
Et plutôt que

fgets(nomFic, SIZENOM + 1, stdin);


je recommande

fgets(nomFic, sizeof nomFic, stdin);



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


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

  fopen et parametre variable

 

Sujets relatifs
modifier ou creer une variable d'environnement[Excel][Résolu] pb de variable avec une feuille
Fonction Explode : histoire de paramètreune variable env qui contient l'url ?
Concatener un $_POST et une variable [RESOLU]variable PHP
Combien de chiffre la variable int contient -elle?Faire un test sur une variable
Nom de variable généré automatiquementProblème de variable
Plus de sujets relatifs à : fopen et parametre variable


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