结构体保存和提取问题
练习用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;
} 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变量,不是数组,如果读取多条记录可能出错,所以改成了逐条读取并输出。 您好,多谢指点!我按照您这个做了修改,可以显示出来的确是乱码。而且我让它输出几项,就有几项。我怀疑这个read()函数是不是有问题。
Please enter your choices:2
how many records to show:1
1985793216 吁? 是复制过去替换的吗,我在vs2015下是正常的。你用的什么编译环境,我测试下。 解决了。前面的add()少了fclose(),应该是数据虽然写进了stream中,但是没有保存到文件中。因此add和read要单独分别打开和关闭文件。 读写模式下,在写文件后加一个fflush(records)应该就可以了吧,不用关闭再打开。你试试这样正常吗。 好主意啊,多谢!
页:
[1]