我正在尝试制作一个小程序,将一些信息保存在文件上,从用户那里获取文件内容和名称的输入。由于某种原因,我无法将 file_name 保存到 FILE *open 中。
当输入字符串作为文件名时有效; open = fopen("文件名.txt","w");但当我尝试输入字符串作为变量时则不然。我查遍了所有地方都找不到答案。
我已经包含了 stdio.h 和 string.h
int main (){
FILE *open;
char first_name[16],last_name[21];
char save_name[30],ext[10];
char file_name[40];
int a,b;
printf("This program will take your name and save it in a file.\n");
printf("Insert your first name:");
scanf("%s",&first_name);
printf("Insert your last name:");
scanf("%s",&last_name);
do{
printf("Insert file name with extension:");
scanf("%[^.].%s", &save_name, &ext);
//Takes filename lenght, minus the dot
a = (int)strlen(save_name)-1;
b = (int)strlen(ext);
sprintf(file_name,"%s.%s",save_name,ext);
}while(a>8 || b>3);
//This is where my problem lies...
open = fopen(file_name,"w");
if(open==NULL){
printf("File %s failed to open, shutting down...",file_name);
}
else{
fprintf(open, "%s %s",first_name,last_name);
printf("\n\nSave successful! File was saved as: %s",file_name);
}
fclose(open);
return 0;
}
最佳答案
问题是您的file_name
中有一个前导换行符!换行符是由您的 scanf()
调用以 "%[^.]"
格式添加的(但我不完全确定为什么)。似乎使用 %s
进行字符串输入会自动删除此字符,但 %[^.]
将接受除 .
之外的所有字符(包括空格)。使用它来修复它(跳过换行符):
scanf("\n%[^.].%s", &save_name, &ext);
欢迎评论这条换行符的来源 - 这对我来说是新闻!
PS:在计算 a
时不需要 - 1
,因为该点永远不会读入 save_name
。
关于c - 带有字符串变量的 fopen 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57848484/