我想允许用户输入要读/写的任何.txt文件的名称。
这是我的代码:
printf("Enter .txt file name\n");
scanf("%s",&fname);
FILE *inputf;
inputf=fopen(&fname,"w");
问题是这种方法不起作用(有& fname)作为参数。
我可以想象它因为C需要“filename.txt”才能工作......即使我输入例如:“custom.txt”,程序也会返回错误“存储块不足以进行此操作”
完成此任务的正确方法是什么?
我使用C和im几乎使用基本命令..(不太高级)
非常感谢!!!
答案 0 :(得分:4)
scanf语句将尝试将输入的文件名存储到内存中,从作为第二个参数传递的地址开始。所以你必须分配/保留一些内存并将其地址传递给scanf。
由于你没有提到fname的类型,让我列出可能性,然后回答你。
char fname;
scanf的第二个参数和fopen的第一个参数都需要是char *。因此,传递fname或& fname的地址是有效的。但它有一个问题。
当您声明'char fname'时,您只为1个字符保留内存。当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");
答案 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
!