C 函数中结构的文件指针和实例

C 函数中结构的文件指针和实例,c,function,text-files,C,Function,Text Files,我试图学习Textfile主题,但我发现自己并不完全理解在void函数name modify()中声明指向文件的双指针是如何工作的。我的理解是,首先我需要为每个文件声明指针(t1表示item.dat)和(t表示tBat.dat)。t1先前由先前的void函数名append赋值。然后我需要为每个文件声明一个struct实例。修改功能的工作方式是从item.dat(“rb”模式)读取数据,并将其写入tBat.dat(“wb”模式),然后在完成后通过交换文件模式item.dat(“wb”模式)tBat

我试图学习Textfile主题,但我发现自己并不完全理解在void函数name modify()中声明指向文件的双指针是如何工作的。我的理解是,首先我需要为每个文件声明指针(t1表示item.dat)和(t表示tBat.dat)。t1先前由先前的void函数名append赋值。然后我需要为每个文件声明一个struct实例。修改功能的工作方式是从item.dat(“rb”模式)读取数据,并将其写入tBat.dat(“wb”模式),然后在完成后通过交换文件模式item.dat(“wb”模式)tBat.dat(“rb”模式)将数据分配回item.dat,对tBat.dat进行修改。我是否正确理解代码?如果我不是,请纠正我

#包括
#包括
结构蝙蝠
{
int-id;
字符名[40];
国际价格;
国际股票;
国际采购;
int左;
};
void append();
无效修改();
char fname[]={“item.dat”};
int main()
{
int-ch;
而(1)
{
printf(“===============================================================================\n\n”);
printf(“1.Append\n\n”);
printf(“2.修改\n\n”);
printf(“任何其他要退出的\n\n”);
printf(“========================================================================================\n\n”);
printf(“\n请输入您的选择:”;
scanf(“%d”和“ch”);
开关(ch)
{
案例1:
附加();
打破
案例2:
修饰();
打破
违约:
printf(“存在”);
返回0;
}
}
返回0;
}
void append()
{
文件*fp;
结构batt,t1;
fp=fopen(fname,“ab”);
printf(“\n输入者ID:”);
scanf(“%d”和t1.id);
printf(“\n输入名称:”);
scanf(“%[^\n]”,t1.name);
printf(“\n输入价格:”);
scanf(“%d”和t1.价格);
printf(“\n输入金额:”);
scanf(“%d”和t1.股票);
fwrite(&t1,sizeof(t1),1,fp);
fclose(fp);
}
void modify()
{
文件*fp,*fp1;
结构batt,t1;
int id,found=0,count=0;
fp=fopen(fname,“rb”);
fp1=fopen(“待定日期”、“wb”);
printf(“\n输入要修改的Bat ID:”);
scanf(“%d”和&id);
而(1)
{
fread(&t,sizeof(t),1,fp);
if(feof(fp))
{
打破
}
如果(t.id==id)
{
发现=1;
printf(“\n输入Batloyee ID:”);
scanf(“%d”和&t.id);
//fflush(stdin);
printf(“\n输入Batloyee名称:”);
scanf(“%[^\n]”,t.name);
printf(“\n输入Batloyee价格:”);
scanf(“%d”和“t.price”);
printf(“\n输入金额:”);
scanf(“%d”和t.stock);
fwrite&t,sizeof(t),1,fp1;
}
其他的
{
fwrite&t,sizeof(t),1,fp1;
}
}
fclose(fp);
fclose(fp1);
如果(找到==0)
{
printf(“对不起,没有找到记录\n\n”);
}
其他的
{
fp=fopen(fname,“wb”);
fp1=fopen(“待定日期”、“rb”);
而(1)
{
fread&t,sizeof(t),1,fp1;
if(feof(fp1))
{
打破
}
fwrite&t,sizeof(t),1,fp);
}
}
fclose(fp);
fclose(fp1);
}  

您的描述非常正确,但有一些误解。这些可能来自代码中的“bug”

你写道:

t1先前由先前的void函数名append赋值

不,这两个函数中的
t1
彼此无关

append
中的
t1
变量在
append
返回时停止存在。用户输入的值保存在文件中(即附加到文件中),因此数据仍存在于文件中,但在
t1
中不存在<代码>t1超出范围

当调用
modify
时,将创建一个全新的变量
t1
。它与
append
函数中的
t1
完全无关

因此,它是两个不同的变量,使用相同的名称。这是可以做到的,因为变量的作用域不同

现在注意代码中的“bug”

append
中,您有:

struct Bat t, t1;
struct Bat t,t1;
但从未使用过
t
。因此,要做以下改变:

struct Bat t, t1; -->     struct Bat t1;
struct Bat t,t1; -->     struct Bat t;
modify
中,也是一样的。在
modify
中,您有:

struct Bat t, t1;
struct Bat t,t1;
但从未使用
t1
。因此,要做以下改变:

struct Bat t, t1; -->     struct Bat t1;
struct Bat t,t1; -->     struct Bat t;
这些“bug”(即未使用的变量,因此是不必要的变量)可能会引起一些混淆。 除此之外,你的描述似乎还不错

顺便说一句:
modify
功能的性能可以提高,但在功能上它似乎可以正常工作