Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2009, 00:09   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Запись структуры и чтение из файла

Собственно пара вопросов:
1) При записи структуры
Код:
typedef struct { unsigned char name[25];
		 int num;
		 int time,uptime;
		 int tarif;
		 int deti;
	       } worker;
при первомм вводе все проходит нормально, но при последующих он перестает требовать ввести первый параметр, т.е имя, переходя сразу ко второму. Сам код:
Код:
worker enter_one(worker record)
 {
  printf("\nФ.И.О работника - ");
//  scanf("%s",record.name);
  gets(record.name);
  printf("\nТабельный номер - ");
  scanf("%d",&record.num);
  printf("\nКоличество отработанных часов u Количество часов сверхурочно - ");
  scanf("%d %d",&record.time, &record.uptime);
  printf("\nПочасовой тариф - ");
  scanf("%d",&record.tarif);
  printf("\nКоличество еждевенцев - ");
  scanf("%d",&record.deti);
  return record;
 }

void enter_data_one(/*char namebd[]*/)
 {
  char sym[1];
  textcolor(15);
  textbackground(0);
  clrscr();

   do
    {

     out=fopen("DataBase.dat","ab");
     BUF=enter_one(BUF);
     fwrite(&BUF,1,sizeof(worker),out);
     printf("\nПродолжить? [Y/N] ");
      do
       scanf("%s",sym);
      while (sym=="Y" || sym=="N");
    }
   while (!strcmp(sym,"Y"));
  fclose(out);
 }
если использовать сканф, то таких проблем не возникает, но тут невозможно полноценно ввести данные)

2) при чтении из файла и последующем выводе на экран последняя считанная структура печатается 2 раза. код:
Код:
void print(/*int index,*/)
 {
  float sum=0;
  clrscr();
  out=fopen("DataBase.dat","rb");
  printf("\nТаблица Заработной Платы: \n");
  printf("   Ф.И.О                       З/П \n");
  printf("#######################################\n");
  int c;
  while (feof(out)==0)
      {
       printf("# ");
       fread(&BUF,sizeof(worker),1,out);
       c=(BUF.tarif*BUF.time+1.5*BUF.tarif*BUF.uptime);
       printf("%-25s",BUF.name);
       printf("- %7.2fр ",c-c*0.01-((c-(c-min)*0.12)-BUF.deti*min));
       sum+=c-c*0.01-((c-(c-min)*0.12)-BUF.deti*min);
       printf("#\n");
       //BUF.name="";BUF.num=0;BUF.time=0;BUF.uptime=0;BUF.deti=0;BUF.tarif=0;
      }
  printf("#######################################\n");
  printf("# Общая сумма выплат:        %7.2fр #\n",sum);
  printf("#######################################\n");
  printf("\nНажмите любую клавишу...");
  getch();
 }
[MI_nor] вне форума Ответить с цитированием
Старый 10.03.2009, 00:22   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

При считывании попробуйте написать gets() два раза.
MaTBeu вне форума Ответить с цитированием
Старый 10.03.2009, 00:29   #3
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Ну такая идея у меня была, но приходится 1й раз что-то вводить 2 раза)
А на счет двойного вывода последней считанной структуры идей нет?
[MI_nor] вне форума Ответить с цитированием
Старый 11.03.2009, 18:10   #4
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

Хм, сказали чтобы избежать повторного ввода нужно очистить буфер клавиатуры. Вопрос, как это сделать в си?)
второй баг я исправил путем проверки функции fread() на возвращаемое значение, если ф-я возвращает 0 то дальше не читаем)

Последний раз редактировалось [MI_nor]; 11.03.2009 в 18:25.
[MI_nor] вне форума Ответить с цитированием
Старый 11.03.2009, 19:18   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Очистка буфера ввода - ffulsh(stdin);
MaTBeu вне форума Ответить с цитированием
Старый 08.04.2009, 10:12   #6
matriohan
Новичок
Джуниор
 
Регистрация: 08.04.2009
Сообщений: 1
По умолчанию

По-моему fwrite написано неправильно второй параметр размер записываемого объекта а третий количество
matriohan вне форума Ответить с цитированием
Старый 08.04.2009, 15:52   #7
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

matriohan, ты прав,я это тоже видел, но все как ни странно работает, поэтому менять ничего не стал))
[MI_nor] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись/чтение из файла (С++) alexov Общие вопросы C/C++ 15 18.01.2009 17:35
Запись и чтение файла... Altera Общие вопросы Delphi 5 06.05.2008 20:22
Чтение структуры файла SDK Помощь студентам 4 23.01.2008 19:30