鱼C论坛

 找回密码
 立即注册
查看: 1335|回复: 6

结构体保存和提取问题

[复制链接]
发表于 2020-7-25 15:24:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
练习用c写个键盘交互输入结构体并存到文件的小程序,编译通过。但是运行后发现保存的内容在读出来的时候有格式问题(有可能是其他问题)。求大神帮忙看看问题出在哪里。
#include<stdio.h>

typedef        struct {
                int age;
                char gend[10];
                char name[10];
        }student;

int SIZE=sizeof(student);

void add(FILE *records );
void read(FILE *records );

void main()
{

       
        FILE *records;
                                               
        if(NULL==(records=fopen("D:\\Personal\\Computer\\students","wb")))
                {
                printf("Can not open the file");
                return;
                }
       
               
        while(1)       
        {
                printf("1:add a new student record\n");
                printf("2:find a new student record\n");
                printf("3:deleted a student record\n");
                printf("0:exit\n");
                printf("Please enter your choices:");
                int choice;
               
                scanf("%d",&choice);
       
                switch(choice)
                {
                  
                case 1:
                        add(records );
                        break;
                case 2:
                        read(records );
                        break;
                case 0:
                        return;
                }
        }
       
}

void add(FILE *records )
        {
                student std;
               
                printf("Please enter student age:");
                scanf("%d", &std.age);
               
                printf("Please enter student gend:");
                scanf("%s", std.gend);
               
                printf("Please enter student name:");
                scanf("%s", std.name);
                                       
                if(fwrite(&std,SIZE,1,records)!=1)
                        {
                        printf("file write error\n");
                        fclose(records);
                        }
                else{
                        printf("file write successfully\n");
                        }
        return;
        }

void read( FILE *records)
        {
        student std;       
        int nub;                               

        printf("how many records to show:");
        scanf("%d",&nub);
                                       
        fseek(records,0,SEEK_SET);
    fread(&std,SIZE,nub,records);
   

        for(int i=0;i<nub;i++)
            {
                 printf("%d\t%s\t%s\t\n",std.age,std.gend,std.name);
                }
                       
        return;
                       
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-25 17:23:04 | 显示全部楼层
if(NULL==(records=fopen("D:\\Personal\\Computer\\students","wb+")))    //这行里文件模式改成wb+

另外就是read()函数有问题,改成下面
void read(FILE *records)
{
    student std;
    int nub;

    printf("how many records to show: ");
    scanf("%d", &nub);

    fseek(records, 0, SEEK_SET);
    //fread(&std, SIZE, nub, records);

    for (int i = 0; i<nub; i++)
    {
        if (fread(&std, SIZE, 1, records) != 1)
        {
            printf("file read error\n");
            return;
        }
        printf("%d\t%s\t%s\t\n", std.age, std.gend, std.name);
    }

    return;
}

read()函数里声明了一个std变量,不是数组,如果读取多条记录可能出错,所以改成了逐条读取并输出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-25 22:05:27 | 显示全部楼层
您好,多谢指点!我按照您这个做了修改,可以显示出来的确是乱码。而且我让它输出几项,就有几项。我怀疑这个read()函数是不是有问题。
Please enter your choices:2
how many records to show:1
1985793216      吁?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 22:50:58 | 显示全部楼层
是复制过去替换的吗,我在vs2015下是正常的。你用的什么编译环境,我测试下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-25 23:26:26 | 显示全部楼层
解决了。前面的add()少了fclose(),应该是数据虽然写进了stream中,但是没有保存到文件中。因此add和read要单独分别打开和关闭文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-26 00:06:56 | 显示全部楼层
读写模式下,在写文件后加一个fflush(records)应该就可以了吧,不用关闭再打开。你试试这样正常吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-26 14:35:09 | 显示全部楼层
好主意啊,多谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 10:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表