Заполняющая программа, печатающая некоторый нежелательный код ascii - PullRequest
0 голосов
/ 09 декабря 2010

Я сделал программу, которая сохраняет структуру в файле, но вывод отличается от ожидаемого, посмотрите,

/*
   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 ]

2 голосов
/ 09 декабря 2010

Две вещи:

  1. Не используйте gets. Это склонно к переполнению буфера.

  2. Если вы хотите, чтобы данные в файле были в форме ascii, вы, вероятно, захотите сделать что-то вроде

    fprintf (fp, "% s:% d \ n", имя стержня, stud.e_no);

в противном случае будет напечатано двоичное представление ваших данных (не читаемое человеком и не переносимое).

2 голосов
/ 09 декабря 2010
  1. atoi не принимает три аргумента. Он берет один (указатель на строку для преобразования) и возвращает его. Это также устарело - вместо этого вы должны использовать strtol. Так что ваш int stud_e не устанавливается.

  2. Вы записываете в файл / двоичное содержимое Stud в файл, поэтому, если вы посмотрите в текстовом редакторе или на экране, оно будет нечитаемым (имя, вероятно, будет выглядеть нормально) , но int (stud_e) будет просто печатать символы, которые соответствуют двоичным данным целочисленного значения

  3. У Gets нет проверки границ, поэтому вы читаете столько символов, сколько вводит пользователь. Если они набирают больше 20, вы попираете другие области памяти, и поведение программы с тех пор не определено и может сделать что угодно. Вы не должны использовать get (используйте вместо этого fgets или scanf с ограничением)

  4. Хорошая практика должна включать проверку возвращаемых значений fopen / fwrite / fclose на наличие ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...