我想将字符串和char数据存储到.dat文件中。程序正在正确运行。但是打开.dat文件后,同名名称写成twise。为什么?我找不到问题。
#include<stdio.h>
struct patients{
char name[8];
char appType[1];
};
int main(void)
{
FILE *F1;
F1 = fopen("appointment.dat","a");
int i = 0;
struct patients detailsArr[5];
for( i = 0 ; i < 5 ; i++ )
{
printf("Enter Patient Name : ");
scanf("%s",detailsArr[i].name);
printf("Enter Appointment Type :");
scanf(" %c",detailsArr[i].appType);
}
if ( F1 == NULL )
{
printf("Error in File Reading !");
return -1;
}
for( i = 0 ; i < 5 ; i++ )
{
fprintf(F1 ,"%s\t",detailsArr[i].name);
fprintf(F1 ,"%s",detailsArr[i].appType);
fprintf(F1 ,"\n");
}
fclose(F1);
return 0;
}
这是我的输出:
Dilshan CRuwan
Ruwan TMangala
Mangala SGanesh
Ganesh CJithen
Jithen SV
答案 0 :(得分:0)
这看起来像古老的填充固定结构格式,所以这些fprintfs是错误的。应该是:
fprintf(F1 ,"%.8s\t",detailsArr[i].name);
fprintf(F1 ,"%.1s",detailsArr[i].appType);
我们还应该将scanf行更改为
scanf("%8s",detailsArr[i].name);
因此它实际上可以存储所有8个。
否则将失败的原因是,当使用最大字符串大小时,您的结构格式似乎是非空终止的字符串。这需要使用printf和scanf格式字符串进行处理,并使用strncpy进行复制和复制。这是一种笨拙的代码,因此除了低级磁盘格式外很少使用。
答案 1 :(得分:0)
您需要更改此行:
char appType[1];
对此:
char appType;
如果要使用%c
scanf
格式说明符。
为避免溢出(和非空终止的字符串),您还应该在此行中使用%7s
代替%s
:
scanf("%s",detailsArr[i].name);
您还需要更改此行:
fprintf(F1 ,"%s",detailsArr[i].appType);
对此:
fprintf(F1 ,"%c",detailsArr[i].appType);
这只是类型更改的问题。