我正在使用开发C ++。我正在制作这个简单的函数calles void quan()
。它涉及文件处理,阅读和追加。问题是在我输入内容后,它崩溃了。我不知道为什么,我认为这是因为fscanf
?
void quan()
{
FILE *fp,*fp1;
int q;
char name[20];
fp=fopen("inv.txt","r");
fp1=fopen("temp.txt","a");
if(fp==NULL)
{
printf("quan error");
}
else
{
printf("enter product name: ");
gets(name);
while(fscanf(fp,"%s %d %f %s",s.prod,s.quant,s.price,s.day)==4 )
{
if(strcmp(s.prod,name)!=0)
{
fprintf(fp1,"%s %d %.2f %s\n",s.prod,s.quant,s.price,s.day);
}
else
{
printf("enter quantity: ");
scanf("%d",&q);
s.quant=s.quant+q;
fprintf(fp1,"%s %d %.2f %s\n",s.prod,s.quant,s.price,s.day);
printf("\nsuccess");
}
}
}
fclose(fp);
fclose(fp1);
remove("inv.txt");
rename("temp.txt","inv.txt");
}
这是我的inv.txt文件
apple 100 20.00 01/01/2015
orange 100 10.00 01/01/2015
banana 50 15.00 01/01/2015
grapes 15 10.00 01/01/2015
fan 100 5.00 01/01/2015
答案 0 :(得分:0)
你还没有在s
中声明了fscanf
的内容,这就是为什么指针无法正常工作且你的应用崩溃的原因。尝试使用&s.prod, &s.prod, &s.quant, &s.price, &s.day
答案 1 :(得分:0)
由于您要打开两个文件,因此必须同时检查错误
if( fp == NULL || fp1 == NULL )
您应该在代码中使用适当的变量名称。
示例:而不是fp
您可以使用inputFile
,这将提供适当的含义,并使代码更易于理解。
fscanf
根据文件中的格式转换规范扫描输入。此类转换的结果存储在格式后面的指针参数指向的位置。所以你必须传递变量的地址来存储匹配的转换,
示例:强>
fscanf( fp, "%19s %d %f %10s", s.prod, &s.quant, &s.price, s.day)
(假设s.prod
是一个大小为20的数组,s.day
也是一个大小为11的数组。
以fscanf
格式指定字符串的大小将避免超出阵列。
此外,您不需要为数组指定&
,因为数组已作为地址传递,而整数和浮点数变量不是(因此明确需要通过&传递的地址)。地址 - 运营商&
)。
如果fscanf
函数的参数不匹配,编译器将抛出警告。你应该在运行程序之前修复这些警告,以避免运行时崩溃。