输入要读取的自定义文件名?

时间:2010-05-08 19:45:41

标签: c file file-io

我想允许用户输入要读/写的任何.txt文件的名称。

这是我的代码:

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

问题是这种方法不起作用(有& fname)作为参数。

我可以想象它因为C需要“filename.txt”才能工作......即使我输入例如:“custom.txt”,程序也会返回错误“存储块不足以进行此操作”

完成此任务的正确方法是什么?

我使用C和im几乎使用基本命令..(不太高级)

非常感谢!!!

5 个答案:

答案 0 :(得分:4)

scanf语句将尝试将输入的文件名存储到内存中,从作为第二个参数传递的地址开始。所以你必须分配/保留一些内存并将其地址传递给scanf。

由于你没有提到fname的类型,让我列出可能性,然后回答你。

  1. char fname;
  2. scanf的第二个参数和fopen的第一个参数都需要是char *。因此,传递fname或& fname的地址是有效的。但它有一个问题。

    当您声明'char fname'时,您只为1个字符保留内存。当scanf尝试存储输入文件名时,它必须写入多于1个字符。所以最终你最终会覆盖其他一些记忆。

    1. char *fname;
    2. 在这种情况下,将fname传递给scanf和fopen,而不是'& fname'。 但是在使用fname之前,你必须分配一些内存(例如使用malloc)。否则fname将包含一些垃圾地址,scanf将尝试覆盖一些随机存储器。

      因此要么将fname声明为char fname[N]要么声明为char *fname = malloc(N+1);(其中N是您要输入的最大可能文件名长度)。

      然后,将fname传递给scanf和fopen,如下所示:

      scanf("%s",fname);
      
      inputf = fopen(fname,"w");
      

答案 1 :(得分:1)

fname定义为char数组,并假设您希望文件名(不带扩展名)作为输入(这意味着您需要将扩展​​名附加到它):

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

请注意,添加了输入长度检查以避免scanf中的缓冲区溢出错误。

答案 2 :(得分:0)

尝试inputf = fopen(fname,"w");

答案 3 :(得分:0)

我认为这可以提供帮助

#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;
                }

答案 4 :(得分:-1)

此外,如果您只想读取文件名,则只需执行sscanf(file,"%s",t),它将文件名存储到t