C 如何在结构保存到bin文件后删除它的内容?

C 如何在结构保存到bin文件后删除它的内容?,c,gcc,C,Gcc,我正在编写一个代码,将患者信息添加到文件中。我使用Linux附带的gcc编译器来编译代码。例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe。有没有办法清除结构以便将中间部分设置为null 我期望midname=“”,但实际输出是midname=“Doe” 例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe 替换 借 有没

我正在编写一个代码,将患者信息添加到文件中。我使用Linux附带的gcc编译器来编译代码。例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe。有没有办法清除结构以便将中间部分设置为null

我期望midname=“”,但实际输出是midname=“Doe”

例如,如果我为文件中第一个患者的中间名编写了“Doe”,并且如果我在文件中添加了另一个没有中间名的患者,则另一个患者的中间名将自动为Doe

替换

有没有办法清除结构以便将中间部分设置为null

只有一个可选字段,但如果您确实想这样做,只需使用0到
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;