2010-05-08 6 views
1

Je souhaite autoriser les utilisateurs à taper le nom de tout fichier .txt à lire/écrire.Entrez le nom de fichier personnalisé à lire?

Ceci est mon code:

printf("Enter .txt file name\n"); 
    scanf("%s",&fname); 
    FILE *inputf; 
    inputf=fopen(&fname,"w"); 

Le problème est que cette méthode ne fonctionne pas (ayant & FNAME) en tant que paramètre.

Je peux l'imaginer car C a besoin de "filename.txt" pour que ça fonctionne ... même si j'entre par exemple: "custom.txt", le programme retourne une erreur de "Le bloc de stockage n'est pas assez grand pour cette opération "

Quelle est la méthode correcte pour accomplir cela?

Im en utilisant C et im à peu près en utilisant les commandes de base .. (pas trop avancé)

Merci beaucoup !!!

+0

Comment définissez-vous (et initialiser) 'fname'? –

Répondre

4

L'instruction scanf essayera de stocker le nom de fichier entré en entrée dans la mémoire, en commençant par l'adresse passée en tant que second argument. Vous devez donc allouer/réserver de la mémoire et transmettre son adresse à scanf.

Comme vous n'avez pas mentionné le type de fname, permettez-moi d'énumérer les possibilités et ensuite vous répondre.

  1. char fname;

Le 2ème argument du scanf et le 1er argument fopen, les deux doivent être char *. Donc, passer l'adresse de fname ou & fname est valide. Mais il a un problème.

Lorsque vous déclarez 'char fname', vous réservez de la mémoire pour seulement 1 caractère. Lorsque scanf essaye de stocker le nom de fichier d'entrée, il devra écrire plus de 1 caractère. Donc, finalement, vous finissez par écraser un autre souvenir.

  1. char *fname;

Dans ce cas, passe à la fois FNAME scanf et fopen, au lieu de '& FNAME'. Mais vous devez allouer de la mémoire (par exemple en utilisant malloc), avant d'utiliser fname. Sinon, fname contiendra une adresse de nettoyage et scanf essaiera d'écraser de la mémoire aléatoire. Donc soit déclarer fname comme char fname[N] ou *fname = malloc(N+1); (où N est la longueur maximale possible du nom de fichier que vous entreriez).

Et puis, passer à la fois FNAME scanf et fopen comme suit:

scanf("%s",fname); 

inputf = fopen(fname,"w"); 
+0

Merci :) Très instructif: D – NLed

+1

Hélas, pas assez informatif. Si vous réservez de la mémoire avec 'malloc', vous devez également la 'libérer', sinon vous aurez une fuite de mémoire. Il est donc recommandé d'utiliser les variables de pile chaque fois que vous le pouvez (dans ce cas, 'char []'). –

+0

Merci pour les informations supplémentaires :) – NLed

0

Essayez inputf = fopen(fname,"w");.

+0

Merci, cela fonctionne aussi :) – NLed

1

Définition fname comme un tableau de caractères, et en supposant que vous attendez le nom du fichier (sans extension) en entrée (ce qui signifie que vous devez ajouter l'extension à elle):

char fname[128]; 
printf("Enter .txt file name\n"); 
scanf("%123s",fname); 
strcat(fname,".txt"); 
FILE *inputf; 
inputf=fopen(fname,"w"); 

Notez qu'une vérification de la longueur d'entrée est ajouté pour éviter les erreurs de dépassement de tampon dans scanf.

+0

Merci beaucoup !!! Vous m'avez montré que je devais en faire un tableau, et comment faire un fichier .txt après chaque nom de fichier .. Merci, très instructif, juste ce que je voulais. – NLed

+0

Être pédant: c'est toujours vulnérable à un débordement de tampon si l'utilisateur saisit 124 caractères ou plus, car il n'y aura pas assez de place pour le terminateur nul. Vous voulez probablement 'scanf ("% 123s ", fname);' à la place. – David

+0

@David, merci, corrigé. –

0

Je pense que cela peut aider

#include <stdio.h> 

void read_name(char *); 

int main(void) 
       { 
       char name[BUFSIZ]; 
       char line[BUFSIZ]; 
       FILE *f; 
       printf("Name "); 
       read_name(name); 
       if ((f=fopen(name,"r"))==NULL) 
       return -1; 
       else 
       return 0; 
       fclose(f); 
       }  
void read_name(char *s) 
       { 
       int i; 
       fgets(s,BUFSIZ,stdin); 
       for (i=0; s[i]!='\n'; i++); 
       s[i]='\0'; 
       return; 
       } 
+1

Bienvenue dans StackOverflow, s'il vous plaît lire [réponse] et apprendre à écrire une bonne réponse. – Marco

Questions connexes