我正在编写代码以将患者的信息添加到文件中。我使用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);
}
答案 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; }
同样,每次添加新元素时,除了在循环中添加新条目之前,都不需要这样做