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



我正在尝试研究Textfile主题,但我发现自己不完全理解void函数name modify((中双指针指向文件的声明是如何工作的。我所理解的是,首先我需要为每个文件声明指针(t1表示item.dat(和(t表示tBat.dat(。t1之前由前面的void函数名称append分配了值。那么我需要为每个文件声明一个struct实例。修改功能的工作方式是从item.dat读取数据("rb"模式(并将其写入tBat.dat("wb"模式。我正确理解代码吗?如果我没有,请纠正我。在这里输入图像描述

#include<stdio.h>
#include<string.h>
struct Bat
{
int id;
char name[40];
int price;
int stock;
int buy;
int left;
};
void append();
void modify();
char fname[]= {"item.dat"};
int main()
{
int ch;
while(1)
{
printf("==================Batloyee Management System=============nn");
printf("1. Appendnn");
printf("2. Modifynn");
printf("any other to Exitnn");
printf("========================================================nn");
printf("nPlease enter your Choice:");
scanf("%d",&ch);
switch(ch)
{
case 1:
append();
break;
case 2:
modify();
break;
default:
printf("exist");
return 0;
}
}
return 0;
}
void append()
{
FILE *fp;
struct Bat t, t1;
fp=fopen(fname,"ab");
printf("nEnter ID:");
scanf("%d",&t1.id);
printf("nEnter name:");
scanf(" %[^n]",t1.name);
printf("nEnter price:");
scanf("%d",&t1.price);
printf("nEnter amount:");
scanf("%d",&t1.stock);
fwrite(&t1,sizeof(t1),1,fp);
fclose(fp);
}

void modify()
{
FILE *fp,*fp1;
struct Bat t,t1;
int id,found=0,count=0;
fp=fopen(fname,"rb");
fp1=fopen("tBat.dat","wb");
printf("nEnter the Bat ID you want to Modify:");
scanf("%d",&id);
while(1)
{
fread(&t,sizeof(t),1,fp);
if(feof(fp))
{
break;
}
if(t.id==id)
{
found=1;
printf("nEnter Batloyee ID:");
scanf("%d",&t.id);
//fflush(stdin);
printf("nEnter Batloyee Name:");
scanf(" %[^n]",t.name);
printf("nEnter Batloyee Price:");
scanf("%d",&t.price);
printf("nEnter amount:");
scanf("%d",&t.stock);
fwrite(&t,sizeof(t),1,fp1);
}
else
{
fwrite(&t,sizeof(t),1,fp1);
}
}
fclose(fp);
fclose(fp1);
if(found==0)
{
printf("Sorry No Record Foundnn");
}
else
{
fp=fopen(fname,"wb");
fp1=fopen("tBat.dat","rb");
while(1)
{
fread(&t,sizeof(t),1,fp1);
if(feof(fp1))
{
break;
}
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;

但从未使用CCD_ 12。所以做这个改变:

struct Bat t, t1; -->     struct Bat t1;

modify中也是一样的。在modify中,您有:

struct Bat t,t1;

但从未使用CCD_ 15。所以做这个改变:

struct Bat t,t1; -->     struct Bat t;

这些";bug";(又称未使用的、因此不必要的变量(可能会引起一些混乱。除此之外,你的描述似乎还可以。

BTW:modify功能的性能可以提高,但功能似乎都是正常的。

最新更新