我想允许用户键入要读取/写入的任何.txt文件的名称。
这是我的代码:
printf("Enter .txt file name\n");
scanf("%s",&fname);
FILE *inputf;
inputf=fopen(&fname,"w");
Run Code Online (Sandbox Code Playgroud)
问题是此方法不能用作参数(具有&fname)。
我可以想象它的原因,因为C需要它才能正常工作,即使我输入例如“ custom.txt”,程序也会返回错误“存储块不足以执行此操作”
什么是实现此目的的正确方法?
我使用C,我几乎使用基本命令..(不太先进)
非常感谢 !!!
scanf语句将从输入为第二个参数的地址开始,尝试将输入的文件名存储到内存中。因此,您必须分配/保留一些内存,并将其地址传递给scanf。
正如您没有提到fname的类型一样,让我列出可能性,然后回答您。
char fname;scanf的第二个参数和fopen的第一个参数都必须为char *。因此,fname或&fname的传递地址有效。但这有一个问题。
声明“ char fname”时,您仅保留1个char的内存。当scanf尝试存储输入文件名时,它将必须写入1个以上的字符。因此,最终您将覆盖其他一些内存。
char *fname;在这种情况下,将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");
Run Code Online (Sandbox Code Playgroud)