首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用结构化数组处理文件

使用结构化数组处理文件
EN

Stack Overflow用户
提问于 2019-05-27 02:23:47
回答 2查看 47关注 0票数 2

我想将字符串和字符数据存储到一个.dat文件中。程序运行correctly.But后,打开.dat文件,同名写的是twise.Why,是吗?我找不到问题所在。

代码语言:javascript
复制
#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;
}

这是我的输出:

代码语言:javascript
复制
Dilshan CRuwan
Ruwan   TMangala
Mangala SGanesh
Ganesh  CJithen
Jithen  SV
EN

回答 2

Stack Overflow用户

发布于 2019-05-27 02:37:52

这看起来像是古老的填充固定结构格式,所以这些fprintfs是错误的。应该是:

代码语言:javascript
复制
fprintf(F1 ,"%.8s\t",detailsArr[i].name);
fprintf(F1 ,"%.1s",detailsArr[i].appType);

我们还应该将scanf行更改为

代码语言:javascript
复制
scanf("%8s",detailsArr[i].name);

所以它实际上可以存储所有的8个。

否则失败的原因是,当使用最大字符串大小时,结构格式看起来是非空终止的字符串。这需要这样处理printf和scanf格式的字符串,并使用strncpy进行复制。这是一种笨拙的代码,所以除了低级磁盘格式之外,它很少被使用。

票数 0
EN

Stack Overflow用户

发布于 2019-05-27 03:31:41

您需要更改此行:

代码语言:javascript
复制
char appType[1];

要这样做:

代码语言:javascript
复制
char appType;

如果要使用%c scanf格式说明符,请执行以下操作。

为了避免溢出(和非null终止的字符串),您还应该在该行中使用%7s而不是%s

代码语言:javascript
复制
 scanf("%s",detailsArr[i].name);

您还需要更改此行:

代码语言:javascript
复制
 fprintf(F1 ,"%s",detailsArr[i].appType);

要这样做:

代码语言:javascript
复制
 fprintf(F1 ,"%c",detailsArr[i].appType);

这只是一个类型变化的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56316268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档