我有以下程序:
#include <stdio.h>
#include <conio.h>
main(char name[31], int phone)
{
FILE *file;
file=fopen("data.txt","w");
if (file==NULL)
{
file=fopen("data.txt","w");
printf("Name : ");
scanf("%s",&name);
printf("\nPhone number : ");
scanf("%d",&phone);
printf("Your booking number is : ");
fprintf(file,"%s;%d\n",name,phone);
fclose(file);
}
else
{
file=fopen("data.txt","a");
printf("Name : ");
scanf("%s",&name);
printf("\nPhone number : ");
scanf("%d",&phone);
fprintf(file,"%s;%d\n",name,phone);
fclose(file);
}
}
当我编译并运行程序时,程序会要求输入名称。输入名称后,会出现警报并关闭程序。该程序曾经工作,但重新启动计算机后,它现在有了这种新的行为。
可能出现什么问题?
答案 0 :(得分:4)
这个程序有一些相当严重的问题。
最小 - 请修复您的格式。你让自己更难注意到bug。如果您无法读取代码,则无法对其进行调试。
接下来是您的main
函数声明:
main(char name[31], int phone)
这不是您定义main
的方式。它的定义必须是这样的:
int main()
{
//code here
}
我对定义甚至编译感到有些惊讶。
您可能想要做的只是将name
和phone
声明为main
中的常规变量,就像您声明file
一样。
编辑:正如@Namfuak在评论中指出的那样,main
可以采取替代形式:
int main(int argc, char** argv)
{
//code here
}
在此表单中,argc
包含在命令行上传递给程序的参数数量,argv
自己保存参数。但是,您不需要此表单,因为您从stdin获取用户输入。只需参数的int main()
版本即可满足您的需求。
继续进行文件访问......
file=fopen("data.txt","w");
if (file==NULL)
{
file=fopen("data.txt","w");
您正在尝试打开该文件,如果它无法打开,请再次打开它?请不要那样做。这不是一个好主意;如果文件不会打开一次,再次尝试不会对你做任何特别的事。
类似地,
else
{
file=fopen("data.txt","a");
这也不是一个好主意。如果file
不为null,则表示您已成功打开文件。你为什么要在不关闭它的情况下重新打开它??
我认为你想要做的就是测试文件是否存在,并附加到文件中,或者创建&amp;如果没有,请打开它。你只需要使用“{”标志,按照fopen docs(强调我的):
追加:打开文件末尾的输出文件。输出操作总是在文件末尾写入数据,并将其扩展。重新定位操作(fseek,fsetpos,rewind)将被忽略。 如果文件不存在,则会创建该文件。
因此,如果您只是以追加("a"
)模式打开文件并确保file
不为空,则可以安全地写入该文件。它不会存在,所以你会创建它,或者它会存在,你会打开它。