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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2011, 03:00   #1
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию Работа с типизироваными файлами

Программа делится на две части,запись в файл и чтение из файла. Если организовать чтение из файла, она работает, хоть и по нулевым значениям. Если записать в файл массив, то он выдаёт ошибку: "Ошибка времени выполнения." Помогите пожалуйста.




Код:
Program n14;

 Type svodka = record 
  number:integer;
    date:record 
     year:integer;
     month:integer;
     day:integer;
         end;
  temperature:real;
  humidity:real;
  pressure:real;
                end;
  
  Var
   massiv:array [1..20] of svodka;
   i,n,k,l,n1,n2,n3,m1,m2,m3:integer;
   Srt:real;
   t:char;
   
   MyFile:file of svodka;
  
  Begin
  
  assign(MyFile,'dat.form');
  Writeln('Если нужно перезаписать файл,то нажмите D, а если нужно выполнить задание,то E');
  read(t);
  
  If (t='D') or (t='d') then
  begin
  rewrite(MyFile);
  Write('Введите количество записей ');
  readln(n);
  
  For i:=1 to n do
  begin
  
  With massiv[i] do
   begin
    number:=i;
    
    Repeat
    write('Введите год ');
    readln(date.year);
    Until (date.year<2011) and (date.year>0);
    
    Repeat
    write('Введите месяц ');
    readln(date.month);
    Until (date.month<=12) and (date.month>=1);
    
    Repeat
    write('Введите день ');
    readln(date.day);
    Until (date.day<=31) and (date.day>=1);
    
    Repeat
    write('Введите температуру по Цельсию ');
    readln(temperature);
    Until (temperature<100) and (temperature>-273.15);
    
    Repeat
    write('Введите влажность ');
    readln(humidity);
    Until (humidity<100) and (humidity>0);
    
    Repeat
    write('Введите давление ');
    readln(pressure);
    Until (pressure<800) and (pressure>700);
   end;
   write(MyFile,massiv[i]);
   end;
   
   close(MyFile);
   
   end
    else
     begin
     reset(MyFile);
     i:=-1;
   While not EoF(MyFile) do
    begin
     i:=i+1;
     seek(MyFile,i);
     read(MyFile,massiv[i+1]);
    end;
    n:=i;
    
   write('Введите номер месяца, среднюю температуру которого надо найти ');
   readln(k);
      
   For i:=1 to n do
    with massiv[i] do
     begin
      If (date.month=k) then
       begin
        Srt:=srt+temperature;
        l:=l+1;
       end;
      end;
      
   Srt:=srt/l;
   Writeln('Средняя температура ',k,'-ого месяца равна ',srt:6:3);
   
   Write('Введите начало периода, который будем выводить ');
   readln(m1,m2,m3);
   Write('Введите конец периода, который будем выводить ');
   readln(n1,n2,n3);
   
   For i:=1 to n do
   with massiv[i] do
    begin 
     if (date.year>m3) and (date.year<n3) then writeln(number,' ',date.day,':',date.month,':',date.year,' ',temperature,' ',humidity,' ',pressure);
     
     if (date.year=m3) then 
      if (date.month>m2) then writeln(number,' ',date.day,':',date.month,':',date.year,' ',temperature,' ',humidity,' ',pressure)
                         else if (date.month=m2) then 
                               if (date.day>=m1) then writeln(number,' ',date.day,':',date.month,':',date.year,' ',temperature,' ',humidity,' ',pressure);
                               
     if (date.year=n3) then 
      if (date.month<n2) then writeln(number,' ',date.day,':',date.month,':',date.year,' ',temperature,' ',humidity,' ',pressure)
                         else if (date.month=n2) then 
                               if (date.day<=n1) then writeln(number,' ',date.day,':',date.month,':',date.year,' ',temperature,' ',humidity,' ',pressure);
     end;
      
   
   
   
  end;
  End.
Form_13 вне форума Ответить с цитированием
Старый 05.10.2011, 11:36   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) выложенный код мне пришлось переформатировать, он в TurboPascal не компилировался - ошибка слишком длинная строка.

2) в предложенном Вами коде есть ошибка при чтении файла.
Вы назначаете количество записей n:=i; на самом деле i у Вас считается от нуля, поэтому количество записей (в данном случае) должно быть n:=i+1;

3) код чтения из типизированного файла крайне замороченный! Зачем так сложно?!!
Зачем каждый раз делать seek - когда указатель при чтении и так переходит на следующую запись.
выбирайте любой из вариантов:
Код:
    n := FileSize(MyFile);
    for i:=1 to n do
      read(MyFile, massiv[n]);
или (мне этот второй вариантон чуть меньше нравится, но зато он ближе к вашему первоначальному варианту)
Код:
    n := 0;
    while not EoF(MyFile) do
    begin
      inc(n);
      read(MyFile, massiv[n]);
    end;
4) вывод у Вас корявенький.. но его я не смотрел...

5) никаких "ошибок времени выполнения" не наблюдал... Что Вы делаете, чтобы их получить - даже не догадываюсь..

Последний раз редактировалось Serge_Bliznykov; 05.10.2011 в 11:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.10.2011, 15:59   #3
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Большое спасибо! Вы очень помогли!
Form_13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами AntiDriver Паскаль, Turbo Pascal, PascalABC.NET 3 06.06.2010 00:04
работа с файлами 4thWing Общие вопросы C/C++ 5 12.04.2010 01:04
C++: работа с файлами MR_Andrew Общие вопросы C/C++ 3 09.04.2010 20:32
Работа с файлами. Си jimmywoodes Помощь студентам 3 28.01.2010 09:27