当我没有将它传递给函数时,打开和读取二进制文件没有问题。但是,在这种情况下,我将它传递给一个函数并继续遇到问题。
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”。只应打印粗体。如果你能给我一个链接,或者如果你有建议,那将非常感激!
答案 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);
}