C 如何在结构保存到bin文件后删除它的内容?
我正在编写一个代码,将患者信息添加到文件中。我使用Linux附带的gcc编译器来编译代码。例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe。有没有办法清除结构以便将中间部分设置为null 我期望midname=“”,但实际输出是midname=“Doe” 例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe 替换 借 有没有办法清除结构以便将中间部分设置为null 只有一个可选字段,但如果您确实想这样做,只需使用0到C 如何在结构保存到bin文件后删除它的内容?,c,gcc,C,Gcc,我正在编写一个代码,将患者信息添加到文件中。我使用Linux附带的gcc编译器来编译代码。例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe。有没有办法清除结构以便将中间部分设置为null 我期望midname=“”,但实际输出是midname=“Doe” 例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe 替换 借 有没
memset(&input,0,sizeof(input))填充所有字段即可代码>例如
注意保存数据时执行fwrite(&input,sizeof(input),1,infle)如果字段大小或字节顺序不相同,或者稍后添加/删除/修改字段,则代码>将不允许正确读取文件,因此这是不可移植的。使用字段的外部表示形式逐个保存字段以便于移植,从格式编号开始,以便在以后更改定义时了解如何读取文件
我还鼓励您检查scanf返回的值,以了解您是否读取了有效值
当前,如果用户输入的字符串太长,您将以未定义的行为从字段中写入,请限制字符串输入的大小
(评论后编辑)
你对scanf的推荐有什么链接吗
例如,如果我很了解您有char name[50]
,即使用户输入一个至少有50个字符的单词scanf(“%s”,input.name)
也不太可能写出至少51个字符。例如,请执行scanf(“%49s”,input.name)
以避免出现未定义行为的风险(49而不是50为字符串结尾的空字符提供位置)
注意:不能使用scanf输入包含空格的复杂名称
一个接一个地保存字段
您是否使用write但使用fprintf,当然,这样做您无法通过fread读取已经存在的值,您需要使用例如fscanf
你也(尝试)重做
while(fread(&input,sizeof(input),1,checkid))
{
check=input.ID;
}
此外,每次添加新元素时,除了在进入循环以添加新条目之前,您不需要使用该元素为什么一直重复使用相同的输入
,为什么它是全局的?只需声明一个使用{0}
初始化的相同类型的新变量zero,例如struct patient new\u patient={0}
,并使用它而不是input
。既然您没有对其进行任何更改,为什么您会期望它呢代码>在阅读之前应该完成这项工作。@alk它可以工作。谢谢我不知道memset可以与字符串一起工作。@Antti Haapala,我做了``打中了病人{char name[50],midname[50],姓氏[50],地址[300];int-telephone,mobile,ID}输入```,而不是struct-patient输入;在struct患者中。我手动将姓名、中间名和姓氏限制为50。和地址为300。(字符地址[300]这就是您所说的限制字符串输入的意思吗?)。我是C区的书呆子,我在自学。你有没有关于你为scanf所说的推荐和一个接一个地保存字段的链接?
void addpatient()
{
system("clear");
char ending; // end do while loop
char temp;
int check;
char choice;
FILE *infile, *checkid;
if((infile= fopen("hospital.bin","ab"))== NULL)
{
printf("Error! opening file. File may not exist or is corrupted");
exit(1);
}
checkid = fopen("hospital.bin","rb");
do
{
while (fread(&input, sizeof(input), 1, checkid))
{
check = input.ID;
}
check++;
input.ID = check;
printf("Last ID used:%d\n", check);
printf("Insert new patient\'s name\n");
scanf("%s",input.name);
printf("Does patient has a middle name? y/n\n");
scanf(" %c", &choice);
if((choice =='y') || (choice=='Y'))
{
printf("Insert new patient\'s middle name\n");
scanf("%s",input.midname);
}
printf("Insert new patient\'s surname\n");
scanf("%s",input.surname);
printf("Insert new patient\'s address\n");
scanf("%c",&temp);
fgets(input.address,300,stdin);
printf("Insert new patient\'s telephone number\n");
scanf("%d",&input.telephone);
printf("Insert new patient\'s mobile phone number\n");
scanf("%d",&input.mobile);
fwrite(&input,sizeof(input),1,infile);
printf("Do you want to continue? y/n\n");
scanf(" %c",&ending);
system("clear");
}while((ending=='Y') || (ending=='y'));
fclose(infile);
fclose(checkid);
}
if((choice =='y') || (choice=='Y'))
{
printf("Insert new patient\'s middle name\n");
scanf("%s",input.midname);
}
if((choice =='y') || (choice=='Y'))
{
printf("Insert new patient\'s middle name\n");
scanf("%s",input.midname);
}
else
input.midname[0] = 0;