使用结构化数组处理文件

时间:2019-05-26 18:23:47

标签: c

我想将字符串和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

2 个答案:

答案 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);

这只是类型更改的问题。