我制作了一个程序,它将结构存储在一个文件中,但输出与我预期的不同,看看,
/*
Students DataBase Program
Date:9th Dec,2010
Topic:Data base in C.
*/
#include <stdio.h>
int main()
{
struct student
{
char name[20];
int e_no;
}stud;
char temp[20],ch;
FILE *fp;
clrscr();
fp=fopen("D:\data1.txt","w+");
gotoxy(28,5);
printf("\nNED CIS ENROLMENT DATABASE\t");
do
{
gotoxy(28,10);
printf("\nEnter name of the student:\t");
gets(stud.name);
gotoxy(27,12);
printf("\nEnter your enrolment number:\t");
gets(temp);
atoi(temp,stud.e_no,10);
fwrite(&stud,sizeof(stud),1,fp);
printf("\nWant to enter another record?[y/n]");
ch=getche();
}
while(ch=='y'||ch=='Y');
getchar();
fclose(fp);
return 0;
}
输出应该是学生的姓名和注册号,但这是我每次输入任何数据时得到的输出类型。
输出文件:
慦慨d@〃݅@赅㈃愀慨d@〃݅@赅㈃
答案 0 :(得分:2)
atoi
不会带三个参数。它需要一个(指向要转换的字符串的指针)并返回它。它也被弃用了 - 你应该使用strtol。所以你的int stud_e没有设置好。
您正在将stud的内存/二进制内容写入文件,因此如果您在文本编辑器或屏幕上查看它将无法读取(名称可能看起来不错) ,但int(stud_e)只会打印对应于整数值的二进制数据的字符
获取没有边界检查,因此您正在读取与用户类型一样多的字符。如果它们输入超过20个,你将会在其他内存区域上进行操作,从那时起,程序行为是未定义的,可以做任何事情。你不应该使用gets(使用带有限制的fgets或scanf)
良好做法包括检查fopen / fwrite / fclose的返回值是否有错误
答案 1 :(得分:2)
两件事:
请勿使用gets
。它容易出现缓冲区溢出。
如果您希望文件中的数据采用ascii格式,您可能希望执行类似
的操作fprintf(fp,“%s:%d \ n”,stud.name,stud.e_no);
否则,它将打印数据的二进制表示(不可读,不可移植)。