fopen et parametre variable

fopen et parametre variable - C - Programmation

Marsh Posté le 07-08-2004 à 20:15:41    

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

Reply

Marsh Posté le 07-08-2004 à 20:15:41   

Reply

Marsh Posté le 07-08-2004 à 20:22:42    

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
Reply

Marsh Posté le 07-08-2004 à 20:34:00    

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

Reply

Marsh Posté le 07-08-2004 à 20:37:27    

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

Reply

Marsh Posté le 07-08-2004 à 20:49:04    

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

Marsh Posté le 07-08-2004 à 21:21:05    

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)
 

Reply

Marsh Posté le 07-08-2004 à 21:32:31    

"\"%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
Reply

Marsh Posté le 07-08-2004 à 21:42:06    

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

Reply

Marsh Posté le 07-08-2004 à 21:46:13    

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

Reply

Marsh Posté le 07-08-2004 à 21:55:48    

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
Reply

Marsh Posté le 07-08-2004 à 21:55:48   

Reply

Marsh Posté le 07-08-2004 à 22:00:59    

ct un exemple pfff ....

Reply

Marsh Posté le 07-08-2004 à 22:17:09    

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

Marsh Posté le 07-08-2004 à 22:22:48    

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
Reply

Marsh Posté le 07-08-2004 à 22:25:09    

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
Reply

Marsh Posté le 07-08-2004 à 22:52:46    

farib a écrit :

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


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

Reply

Marsh Posté le 07-08-2004 à 23:33:52    

oki doki je vous remercie tous ;)

Reply

Marsh Posté le 08-08-2004 à 02:10:41    

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
Reply

Marsh Posté le 08-08-2004 à 11:15:28    

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
Reply

Marsh Posté le 11-05-2005 à 12:53:14    

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

Reply

Marsh Posté le 11-05-2005 à 13:26:13    

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

Marsh Posté le 11-05-2005 à 13:26:51    

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

Marsh Posté le 11-05-2005 à 13:31:48    

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

Marsh Posté le 11-05-2005 à 15:20:16    

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


 
 

Reply

Marsh Posté le 11-05-2005 à 15:27:08    

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

Reply

Marsh Posté le 11-05-2005 à 17:39:37    

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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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