William777 发表于 2020-7-25 15:24:47

结构体保存和提取问题

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

typedef        struct {
                int age;
                char gend;
                char name;
        }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;
                       
        }

superbe 发表于 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变量,不是数组,如果读取多条记录可能出错,所以改成了逐条读取并输出。

William777 发表于 2020-7-25 22:05:27

您好,多谢指点!我按照您这个做了修改,可以显示出来的确是乱码。而且我让它输出几项,就有几项。我怀疑这个read()函数是不是有问题。
Please enter your choices:2
how many records to show:1
1985793216      吁?

superbe 发表于 2020-7-25 22:50:58

是复制过去替换的吗,我在vs2015下是正常的。你用的什么编译环境,我测试下。

William777 发表于 2020-7-25 23:26:26

解决了。前面的add()少了fclose(),应该是数据虽然写进了stream中,但是没有保存到文件中。因此add和read要单独分别打开和关闭文件。

superbe 发表于 2020-7-26 00:06:56

读写模式下,在写文件后加一个fflush(records)应该就可以了吧,不用关闭再打开。你试试这样正常吗。

William777 发表于 2020-7-26 14:35:09

好主意啊,多谢!
页: [1]
查看完整版本: 结构体保存和提取问题