Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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


Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2009, 17:36   #1
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 23.05.2009
Сообщений: 119
Вопрос Загрузка данных из типизированного файла

всем приветик!!!

Вот мое задание
Цитата:
Разработать программу.
Для каждого сотрудника задается:
учетный номер,
фамилия,
почасовая ставка,
количество отработанных часов.
Oрганизовать диалоговый цикл для выполнения следующих действий:
ввод нового сотрудника в массив записей ,
сохранение массива записей в типизированном файле,
загрузка данных из ранее созданного файла.
Каждое действие оформляется как подпрограмма.
Я все сделала, но никак не получается нормально загрузить из файла данные...
Что я не так сделала???
Подскажите пожалуста...

Код:
program Sotrud1;
const
    max=100;
type
  TNewSotrudnik=record
         Nomer: byte;
         FIO: string[50];
         Stavka: real;
         Otrabka: real;
         end;
  TStat=array [1..max] of TNewSotrudnik;
  TypizFile=File of TStat;{типизированный файл}

  var
  stat: TStat;
  key, x: byte;
  F: TypizFile;

{ввод нового сотрудника в массив записей}
procedure NewStaff(var stat: TStat; var n:byte);
var
  i:byte;
begin
  write ('Vvesti kolichestvo sotrudnikov: ');
  readln (n);
  writeln;
  for i:=1 to n do
   begin
   writeln('New sotrudnik');
   writeln('---------------------');
   write('Nomer Sotrudnika: ');
   readln(stat[i].Nomer);
   write('Familia: ');
   readln(stat[i].FIO);
   write('Chasovaa Stavka: ');
   readln(stat[i].Stavka);
   write('Otrabotanie chasi: ');
   readln(stat[i].Otrabka);
   writeln('---------------------');
   end;
  writeln ('OK, dobavlen!');
  writeln;
end;

{сохраняем данные  файл}
procedure Sohr(var stat: TStat; var n:byte; var tmpF: TypizFile);
var
  i:byte;
begin
  Assign(tmpF,'my.dat');
  Rewrite(tmpF);
  for i:=1 to n do
  begin
  writeln('<#: ', stat[i].Nomer,'>',' familia: ',stat[i].Fio,' stavka: ',stat[i].Stavka:3:2,' otrabotka: ',stat[i].Otrabka:3:2);
  write(tmpF, stat);{запись в файл}
  end;
  close(tmpF);{закрываем}
end;

{загружаем  данные}
procedure Zagr(var stat: TStat; var n:byte; var tmpF: TypizFile);
var
  i:byte;
begin
  Assign(tmpF,'my.dat');{инициализация}
  Reset (tmpF);{подготовка файла к чтению}
  while not EOF (tmpF) do
   begin
   read (tmpF, stat);{чтение из файла до конца}
   for i:=1 to n do{ вывод на экран}
     writeln('<#: ', stat[i].Nomer,'>',' familia: ',stat[i].Fio,' stavka: ',stat[i].Stavka:3:2,' otrabotka: ',stat[i].Otrabka:3:2);
   end;
  Close (tmpF);{закрываем}
end;

BEGIN
  repeat
  writeln('PROGRAM');
  writeln('press 1 - Dobavit new sotrudnika');
  writeln('press 2 - Sohranit v file');
  writeln('press 3 - Zagruzit iz file');
  writeln('press 0 - Exit');
  readln(key);
  case key of
         1: NewStaff(stat,x);
         2: Sohr(stat,x,F);
         3: Zagr(stat,x,F);
  end;
  until key=0;
END.
diliana вне форума Ответить с цитированием
Старый 21.07.2009, 18:12   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Ошибки:
1. При записи в файл в процедуре Sohr.
Команда write(tmpF, stat); записывает в файл весь массив, т.е. ты сохраняешь массив n раз.

2. При загрузке из файла в процедуре Zagr.
Ты считываешь массив n раз, т.к. он был записан несколько раз.
+ если выключить, а затем снова запустить программу, то при загрузке переменная n будет иметь неопределенное значение (точнее 0) и загруженные данные не будут отображены.

Лучше объявить тип файла не как массив, а как файл записей, т.е.
Код:
TypizFile=File of TNewSotrudnik;
Тогда сохранение будет таким:
Код:
{сохраняем данные  файл}
procedure Sohr(var stat: TStat; var n:byte; var tmpF: TypizFile);
var
  i:byte;
begin
  Assign(tmpF,'my.dat');
  Rewrite(tmpF);
  for i:=1 to n do
  begin
  writeln('<#: ', stat[i].Nomer,'>',' familia: ',
  stat[i].Fio,' stavka: ',stat[i].Stavka:3:2,' otrabotka: ',
  stat[i].Otrabka:3:2);
  write(tmpF, stat[i]);{запись в файл одной записи stat[i]}
  end;
  close(tmpF);{закрываем}
end;
Загрузка:
Код:
{загружаем  данные}
procedure Zagr(var stat: TStat; var n:byte; var tmpF: TypizFile);
var
  i:byte;
begin
  Assign(tmpF,'my.dat');{инициализация}
  Reset (tmpF);{подготовка файла к чтению}
  i := 0;
  while not EOF (tmpF) do
   begin
   Inc(i);
   read (tmpF, stat[i]);{чтение из файла одной записи stat[i]}

     writeln('<#: ', stat[i].Nomer,'>',' familia: ',
     stat[i].Fio,' stavka: ',stat[i].Stavka:3:2,' otrabotka: ',
     stat[i].Otrabka:3:2);
   end;
  n := i; { i = количеству записей в файле }
  Close (tmpF);{закрываем}
end;
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 21.07.2009 в 18:15.
Daramant вне форума Ответить с цитированием
Старый 21.07.2009, 18:49   #3
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 23.05.2009
Сообщений: 119
По умолчанию

Daramant
спасибо!
очень здорово получилось!

Обьясните мне одну вещь - вот вы использовали счетчик, это обязательно нужно???

Код:
 i := 0;
  while not EOF (tmpF) do
   begin
   Inc(i);
diliana вне форума Ответить с цитированием
Старый 21.07.2009, 18:56   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Мы не знаем сколько записей в файле. Поэтому используем цикл:
while not EOF (tmpF) do

При чтении записи увеличиваем i на единицу. ( Inc(i); <=> i := i + 1;)
Т.е. первую запись запишем в массив под индексом 1.
Вторую под индексом 2.
Для подсчета записей я и использую i;

После завершения цикла i будет равно количеству записей, прочтенных из файла.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 21.07.2009, 19:05   #5
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 23.05.2009
Сообщений: 119
По умолчанию

Daramant
спасибо

Теперь ясно!
Извините за занудство...но я хочу все знать.
Вот я просто в качестве эксперимента попробывала без счетчика, но ведь все также считывается...
Как это вы обьясните???

Код:
{загружаем  данные}
procedure Zagr(var stat: TStat; var n:byte; var tmpF: TypizFile);
var
  i:byte;
begin
  Assign(tmpF,'my.dat');{инициализация}
  Reset (tmpF);{подготовка файла к чтению}
  //i := 0;
  while not EOF (tmpF) do
   begin
   //Inc(i);
   read (tmpF, stat[i]);{чтение из файла одной записи stat[i]}
   writeln(
   '<#: ', stat[i].Nomer,'>',' familia: ',stat[i].Fio,
   ' stavka: ',stat[i].Stavka:3:2,' otrabotka: ',stat[i].Otrabka:3:2);
   end;
  //n := i; { i = количеству записей в файле }
  Close (tmpF);{закрываем}
end;
diliana вне форума Ответить с цитированием
Старый 21.07.2009, 19:16   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Просто у Вас условие
Цитата:
ввод нового сотрудника в массив записей ,
сохранение массива записей в типизированном файле,
загрузка данных из ранее созданного файла.
Хотя в этой программе массив вообще не нужен, так как никаких действий с массивом не выполняется, напрмер сортировка.
puporev вне форума Ответить с цитированием
Старый 21.07.2009, 19:19   #7
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
я хочу все знать.
Похвально, тогда давай разберемся.
Цитата:
Вот я просто в качестве эксперимента попробывала без счетчика, но ведь все также считывается...
Как это вы обьясните???
Что происходит:
Вызывается процедура.
i локальная переменная, автоматически она не инициализируется.
Т.е. она имеет какое-то случайное значение. Если это значение будет больше чем размерность массива (100), то будет исключение (ошибка) - выход индекса за пределы массива.
У меня i было равно 23 (у тебя, возможно, другое значение).

Далее:
Считывается первая запись.
Она записывается в массив по индексу state[23] (т.к. i = 23).
Выводится на экран.
Считывается вторая запись.
Она записывается в массив по индексу state[23] (т.к. i = 23).
Т.е. затерает предыдущую запись.
Выводится на экран.
И так все записи.

Т.е. записи на экран выведутся верно, но в массиве в неизвестном месте (у меня это state[23]) будет находиться лишь последняя запись.

Попробуй загрузить таким образом записи, замет сохранить их и опять загрузить. У меня они загрузились не корректно.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 21.07.2009 в 19:22.
Daramant вне форума Ответить с цитированием
Старый 21.07.2009, 19:25   #8
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 23.05.2009
Сообщений: 119
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Просто у Вас условие

Хотя в этой программе массив вообще не нужен, так как никаких действий с массивом не выполняется, напрмер сортировка.
puporev, я вас не поняла....
то есть как не нужен массив - а как же массив записей?
diliana вне форума Ответить с цитированием
Старый 21.07.2009, 19:33   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Я и говорю, что по условию у Вас создать массив записей вводом или чтением из существующего файла. Поэтому при чтении файла нужен счетчик. А просто ввести некоторое количество записей в файл, или вывести их из файла, массив не нужен.
puporev вне форума Ответить с цитированием
Старый 21.07.2009, 19:34   #10
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 23.05.2009
Сообщений: 119
По умолчанию

Daramant

Все поняла теперь!!!
СПАСИБО Большое за обьяснения (хотела поставить вам отзыв, только что-то не получается...окно какое-то вылезает)
diliana вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 20000 рублей в месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка данных из файла JIK Помощь студентам 4 19.05.2013 11:17
Cортировка типизированного файла по 3м признакам Dremgor Помощь студентам 3 05.06.2009 13:10
загрузка данных из тестового файла gribog БД в Delphi 16 19.07.2007 14:06


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS