我想将字符串和字符数据存储到一个.dat文件中。程序运行correctly.But后,打开.dat文件,同名写的是twise.Why,是吗?我找不到问题所在。
#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
发布于 2019-05-27 02:37:52
这看起来像是古老的填充固定结构格式,所以这些fprintfs是错误的。应该是:
fprintf(F1 ,"%.8s\t",detailsArr[i].name);
fprintf(F1 ,"%.1s",detailsArr[i].appType);
我们还应该将scanf行更改为
scanf("%8s",detailsArr[i].name);
所以它实际上可以存储所有的8个。
否则失败的原因是,当使用最大字符串大小时,结构格式看起来是非空终止的字符串。这需要这样处理printf和scanf格式的字符串,并使用strncpy进行复制。这是一种笨拙的代码,所以除了低级磁盘格式之外,它很少被使用。
发布于 2019-05-27 03:31:41
您需要更改此行:
char appType[1];
要这样做:
char appType;
如果要使用%c
scanf
格式说明符,请执行以下操作。
为了避免溢出(和非null终止的字符串),您还应该在该行中使用%7s
而不是%s
:
scanf("%s",detailsArr[i].name);
您还需要更改此行:
fprintf(F1 ,"%s",detailsArr[i].appType);
要这样做:
fprintf(F1 ,"%c",detailsArr[i].appType);
这只是一个类型变化的问题。
https://stackoverflow.com/questions/56316268
复制相似问题