fopen et parametre variable - C - Programmation
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
Marsh Posté le 07-08-2004 à 20:34:00
c'est initialisé comme ca :
Code :
|
je debute donc je ne comprend pas tout ce que tu ecris
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)
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 )
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
char *ficname;
ficname = malloc(MAX_PATH);
fgets(ficname, MAX_PATH, stdin);
si MAX_PATH n'existe pas, tu peux mettre 260.
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
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 ??
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 ?? |
/home/farib/dossier_a_la_con
merci, grandissime XP, de simplifier le monde !
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 :
|
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.
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.
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
Marsh Posté le 07-08-2004 à 22:52:46
farib a écrit : /home/farib/dossier_a_la_con |
farib (t'es celui que je connais ?)
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
Marsh Posté le 08-08-2004 à 11:15:28
Taz a écrit : |
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);
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
|
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); |
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...) |
En plus, si le char* n'a pas été initialisé...
Marsh Posté le 11-05-2005 à 13:31:48
Athlon2x a écrit : c'est initialisé comme ca :
|
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
Marsh Posté le 11-05-2005 à 15:20:16
désolé, j'avais pas bien réfléchi... voilà qui va mieux
Spoiler : /#FILE *fp; |
Marsh Posté le 11-05-2005 à 15:27:08
Code :
|
autant ecrire
Code :
|
Marsh Posté le 11-05-2005 à 17:39:37
Sve@r a écrit :
|
Marche pas. Il faut éliminer le '\n'.
Extrait de
http://mapage.noos.fr/emdel/notes.htm#fichiers
|
Et plutôt que
fgets(nomFic, SIZENOM + 1, stdin); |
je recommande
fgets(nomFic, sizeof nomFic, stdin); |
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)
J'espere que vous comprenez ma question ... pas facile à expliquer.
Rappel : d'habitude fopen est utilisé comme ceci :
Moi je souhaite remplacer " "monfichier" " par une variable.
Merci