在函数中打开二进制文件?见代码:

时间:2011-12-02 04:48:31

标签: c function file-io binaryfiles stdio

当我没有将它传递给函数时,打开和读取二进制文件没有问题。但是,在这种情况下,我将它传递给一个函数并继续遇到问题。

void fun1 (int amount,struct inventory a[],FILE *fp);

int main()
{
    tag a[10];
    int amount;
    int i;
    FILE *fp;

    fp=fopen("e:\\invent.txt","wb");

    printf("How many items do you want to enter? ");
    scanf("%d",&amount);
    for(i=1;i<=amount;i++)
    {
        printf("Enter the name of the item: ");
        scanf("%s",a[i].name);
        printf("Enter the unit amount the item has: ");
        scanf("%d",&a[i].num);
        printf("Enter the unit price for the item: ");
        scanf("%f",&a[i].price);
        fwrite(&a[i],sizeof(a[i]),amount,fp);
    }
    fclose(fp);
    fun1(amount,a,fp);           
}

^^这是我的输入加上我的函数调用^^。

我的输入:

  

您想要输入多少件商品? 2
  输入项目名称:Hammer
  输入项目的单位金额:32
  输入商品的单价:11
  输入项目名称:Nails
  输入项目的单位金额:43
  输入商品的单价:12

void fun1 (int amount,struct inventory a[],FILE *fp)
{
    int i;
    fp=fopen("e:\\invent.txt","rb");
    while(fread(&a[amount],sizeof(tag),amount,fp) == amount)
    {
        printf("\nItem\tUnit #\tPrice\n");
        for(i=1;i<=amount;i++)
        {
            printf("\n%s\t%d\t%.2f",a[i].name,a[i].num,a[i].price);
        }
    }
    fclose(fp);
    getchar();

}

^^我的功能^^

我的输出:

  

项目单位#价格

     

Hammer 32 11.00

     

Hammer 32 11.00

     

项目单位#价格

     

Hammer 32 11.00

     

指甲43 12.00

不应该两次打印“Hammer”。只应打印粗体。如果你能给我一个链接,或者如果你有建议,那将非常感激!

2 个答案:

答案 0 :(得分:1)

在您的输入中,您是1索引数组。数组是零索引的,因此您访问的最后一个索引超出范围,并且无法告诉您将获得什么。

将该循环更改为

for (i = 0; i < amount; i++) 

答案 1 :(得分:0)

问题在于你的fun1方法我认为你正在尝试收集整个列表,但是你给出了结构的大小,所以它可以读取第一个结构

试试这个:

void fun1 (FILE *fp)
{

    _tag a;
    fp=fopen("e:\\invent.txt","rb");
    while(fread(&a,sizeof(_tag),1,fp) == 1)
    {
        printf("\nItem\tUnit #\tPrice\n");


        printf("\n%s\t%d\t%d",a.name,a.num,a.price);


    }
    fclose(fp);

}