【问题标题】:Opening a Binary file in a function? See Code:在函数中打开二进制文件?见代码:
【发布时间】:2011-12-02 04:48:30
【问题描述】:

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

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
输入物品名称:锤子
输入物品的单位数量:32
输入商品的单价:11
输入商品名称:钉子
输入商品的单位数量: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();

}

^^我的功能^^

我的输出:

商品单位#价格

锤子 32 11.00

锤子 32 11.00

商品单位#价格

锤子 32 11.00

钉子 43 12.00

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

【问题讨论】:

  • 只是出于好奇,为什么要将fp 传递给函数?它在main 中关闭并在fun1 中重新打开,因此它也可以是fun1 中的局部变量。
  • 另一个注意事项,在main 中,您将a 定义为tag a[10],但fun1 需要struct inventory 数组。我猜你在某处有typedef struct inventory tag。如果今天只是有点混乱,想想几个月后会怎样。为了您自己的利益,您应该与变量和参数的类型保持一致。
  • 我将 fp 传递给函数,因为我正在做的项目需要我有一个二进制文件,并且我必须在函数中显示输出。我是整个 FILE I/O 方面的新手,所以我确定我是否做对了。
  • 文件指针不必传递,只需在函数中再次声明即可。在函数内再次打开文件就可以了。

标签: c function file-io binaryfiles stdio


【解决方案1】:

在您的输入中,您正在对数组进行 1 索引。数组是零索引的,因此您访问的最后一个索引超出了界限,并且不知道您会得到什么。

将该循环更改为

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

【讨论】:

    【解决方案2】:

    问题出在你的 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2016-09-09
      相关资源
      最近更新 更多