C中的文件读取(fscanf)

时间:2015-02-25 13:16:25

标签: c

我正在使用开发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

2 个答案:

答案 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函数的参数不匹配,编译器将抛出警告。你应该在运行程序之前修复这些警告,以避免运行时崩溃。