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

时间:2019-05-05 08:09:52

标签: c gcc

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

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

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);
}

1 个答案:

答案 0 :(得分:0)

  

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

只需替换

 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;
  

有没有办法清除该结构,以便将中间位置设置为null?

只有一个可选字段,但是如果您真的想做的话,只用0到memset(&input, 0, sizeof(input));填充所有字段。


请注意,如果字段的大小或字节顺序不同,或者稍后添加/删除/修改字段,则fwrite(&input,sizeof(input),1,infile);保存数据将无法正确读取文件,因此这是不可移植的。使用它们的外部表示形式可移植地保存这些字段,并以格式编号开头,以了解如何在以后更改定义时读取文件。

我还建议您检查 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))      {        检查= input.ID;      }

同样,每次添加新元素时,除了在循环中添加新条目之前,都不需要这样做