文件程序打印一些不需要的ascii代码

时间:2010-12-09 12:28:26

标签: c file

我制作了一个程序,它将结构存储在一个文件中,但输出与我预期的不同,看看,

/*
   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@〃݅@຦赅㈃

2 个答案:

答案 0 :(得分:2)

  1. atoi不会带三个参数。它需要一个(指向要转换的字符串的指针)并返回它。它也被弃用了 - 你应该使用strtol。所以你的int stud_e没有设置好。

  2. 您正在将stud的内存/二进制内容写入文件,因此如果您在文本编辑器或屏幕上查看它将无法读取(名称可能看起来不错) ,但int(stud_e)只会打印对应于整数值的二进制数据的字符

  3. 获取没有边界检查,因此您正在读取与用户类型一样多的字符。如果它们输入超过20个,你将会在其他内存区域上进行操作,从那时起,程序行为是未定义的,可以做任何事情。你不应该使用gets(使用带有限制的fgets或scanf)

  4. 良好做法包括检查fopen / fwrite / fclose的返回值是否有错误

答案 1 :(得分:2)

两件事:

  1. 请勿使用gets。它容易出现缓冲区溢出。

  2. 如果您希望文件中的数据采用ascii格式,您可能希望执行类似

    的操作

    fprintf(fp,“%s:%d \ n”,stud.name,stud.e_no);

  3. 否则,它将打印数据的二进制表示(不可读,不可移植)。