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

C 在函数中打开二进制文件?见代码:,c,function,file-io,binaryfiles,stdio,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

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

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);           
}
void fun1(整数金额,结构库存a[],文件*fp);
int main()
{
标签a[10];
整数金额;
int i;
文件*fp;
fp=fopen(“e:\\invent.txt”、“wb”);
printf(“您要输入多少项?”);
scanf(“%d”和金额);

对于(i=1;i在您的输入中,您是1-索引数组。数组是零索引的,因此您访问的最后一个索引超出了范围,并且不知道您将得到什么

将该循环更改为

for (i = 0; i < amount; i++) 
for(i=0;i
问题在于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);

}

出于好奇,您为什么要将
fp
传递给函数?它在
main
中关闭,在
fun1
中重新打开,因此它也可以是
fun1
中的局部变量。另外,在
main
中,您将
a
定义为
标记a[10]
,但是
fun1
想要一个
struct inventory
数组。我猜你在什么地方有
typedef struct inventory标签
。如果今天只是有点困惑,想想几个月后会是什么样子。为了你自己的利益,你应该与变量和参数的类型保持一致。我将fp传递给function因为我正在做的项目要求我有一个二进制文件,并且我必须在函数中显示输出。我对整个文件i/O都是新手,所以我确信我是否做得对。不必传递文件指针,只需在函数中再次声明它。因为你在函数中再次打开文件,所以一切都会好起来。
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);

}