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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2014, 12:17   #1
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию В чем ошибка? Файлы

Почему в строке read(f, train); (29 строка) показывает ошибку: Ошибка времени выполнения: Чтение после конца потока невозможно.
Код:
const
  file_name = 'input.dat';

type
  Ttrain = record
    number: string[3];
    destination: string[20];
    hour, minute: byte;
  end;
  arr = array [byte] of Ttrain;

var
  f_in: file of Ttrain;// Входной файл
  f_out: text;        // Выходной файл
  train: Ttrain;        // Единичная запись о поезде
  mas: arr;           // Информация о всех поездах
  count_rec: byte;// Количество записей в файле(массиве)
  data: string;

///Создает массив mas из записей типизированного файла f и определяет число этих записей k
procedure input_mas(f: file of Ttrain; var mas: arr; var k: byte);
begin
  assign(f, file_name);
  reset(f);
  k := 0;
  while not Eof(f) do
  begin
    inc(k);
    read(f, train);
    mas[k] := train
  end;
  close(f)
end;

///Процедура поиска всех поездов, отходящих после данного времени
procedure Find_trains_after_time(const mas: arr; k: byte; data: string);
var
  buf: array of string; h, m, i: byte;
begin
  writeln('------------------------');
  write('Введите время: ');
  readln(data);
  buf := data.split('.');
  h := StrToInt(buf[0]);
  m := StrToInt(buf[1]);
  writeln('Поезда, отходящие после данного времени:');
  for i := 1 to k do
    if (mas[i].hour > h ) then
      writeln('<', mas[i].number)
      else
    if (mas[i].hour = h) then
      if (mas[i].minute > m) then
        writeln('<', mas[i].number);
end;


///Процедура поиска в массиве mas с количеством элементов k поездов для каждого пункта назначения
procedure Find_trains(const mas: arr; k: byte);
var
  set_name: set of string; count: integer;
begin
  set_name := [];
  count := 0;
  writeln('------------------------------');
  writeln('Пункт назначения:', 'Количество поездов:':25); 
  for var i := 1 to k do
  begin
    if (mas[i].destination in set_name) then continue; // Пункт назначения уже обработан
    count := 1;
    for var j := i + 1 to k do // Просмотр всего оставшегося массива
      if (mas[j].destination = mas[i].destination) then count += 1;
    var pos_vyvod := 20 - (length(mas[i].destination) - length('Пункт назначения:'));
    writeln('>', mas[i].destination, count:pos_vyvod);
    set_name += [mas[i].destination]// Множество обработанных городов
  end;
end;

///Процедура удаления из файла f записей о поездах, следующих в данный пункт назначения
procedure Delete_rec(var f: file of Ttrain) ;
var
  del_city: string;
begin
  assign(f, file_name);
  reset(f);
  write('Введите с большой буквы пункт назначения, для которого нужно удалить все записи о поездах: ');
  readln(del_city);
  
  var i := 0;
  while (i <= filesize(f) - 1) do //Просмотр всех записей
  begin
    read(f, train);
    if train.destination = del_city then 
    begin
      for var j := i to filesize(f) - 2 do // Перетирание текущей записи
      begin
        seek(f, j + 1);
        read(f, train);
        seek(f, j);
        write(f, train);
      end;
      seek(f, filesize(f) - 1);
      truncate(f);
      seek(f, i)
    end
    else 
    begin
      inc(i);
      seek(f, i)
    end
  end
end;

///Процедура сортировки массива mas записей по возрастанию номера поезда и убыванию времени отправки
procedure sort_mas(var mas: arr; const k: byte);
begin
  for var i := 1 to k - 1 do
    for var j := i + 1 to k do
      if mas[i].number > mas[j].number then
        swap(mas[i], mas[j])
      else 
      if mas[i].number = mas[j].number then
        if mas[i].hour < mas[j].hour then
          swap(mas[i], mas[j])
        else
        if mas[i].hour = mas[j].hour then
          if mas[i].minute < mas[j].minute then
            swap(mas[i], mas[j]);
end;

///Процедура вывода упорядоченного массива mas в новый текстовый файл f
procedure Output(const mas: arr; k: byte; var f: text);
begin
  Assign(f, 'output.txt');
  Rewrite(f);
  writeln(f, 'Номер поезда:', 'Пункт назначения:':22, 'Время отправки:':38);
  var s: string;
  var s1: string;
  for var i := 1 to k do
  begin
    s := '';
    s1 := '';
    var a := 5 - (length(mas[i].number) - length('Номер поезда:'));
    for var j := 1 to a do s += ' ';
    var b := 20 - (length(mas[i].destination) - length('Пункт назначения:'));
    for var j := 1 to b do s1 += ' ';   
    
    var h := IntToStr(mas[i].hour);
    if length(h) = 1 then h := '0' + h;
    var m := IntToStr(mas[i].minute);
    if length(m) = 1 then m := '0' + m;
    writeln(f, mas[i].number, s, mas[i].destination, s1, h, '.', m)
  end;
  close(f)
end;

begin
  input_mas(f_in, mas, count_rec);
  Find_trains_after_time(mas, count_rec, data);
  find_trains(mas, count_rec);
  delete_rec(f_in);
  sort_mas(mas, count_rec); 
  output(mas, count_rec, f_out);
end.
Вложения
Тип файла: txt input.txt (395 байт, 131 просмотров)
azalia вне форума Ответить с цитированием
Старый 15.01.2014, 12:17   #2
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

Еще есть программа для создания input.dat
Код:
type
  Ttrain = record
            number: string[30];
            destination: string[50];
            hour, minute: byte;
           end;
Var
  f_in   : text;            // входной файл
  f_out  : file of Ttrain;   // выходной файл
  train  : Ttrain;           
  str    : string;          // очередная входная строка
  buf    : array of string;
  time   : array of string;
Begin
  assign(f_in, 'input.txt');
  assign(f_out, 'input.dat');
  Reset(f_in); 
  Rewrite(f_out);
  while not Eof(f_in) do 
  begin
    readln(f_in, str);    // Считать очередную строку из файла
    buf:=str.Split(';');  // Разделить на отдельные составляющие
    with train do 
    begin
      number := buf[0];
      destination := buf[1];
      time:= buf[2].Split('.');
      hour := strToInt(time[0]);
      minute := strToInt(time[1]);
    end;
    write(f_out, train);  // Запись записи в файл
  end;
  close(f_in);
  close(f_out);
end.
azalia вне форума Ответить с цитированием
Старый 15.01.2014, 14:33   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Еще есть программа для создания input.dat
Код:
type
  Ttrain = record
            number: string[30];
            destination: string[50];
            hour, minute: byte;
           end;
Цитата:
Код:
type
  Ttrain = record
    number: string[3];
    destination: string[20];
    hour, minute: byte;
  end;
никакой разницы в описании типов не замечаете?!!

Это крайне важно.
Читать можно только файл, который имеет заданную структуру.
Т.е. структура файла, который Вы читаете должна быть ТОЧНО ТАКОЙ ЖЕ, как и структура, которую Вы записываете! (ну, точнее, файл, который Вы читаете реально должен иметь ту структуру, в которую Вы его читаете).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.01.2014, 15:09   #4
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

спасибо)) всё работает
azalia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем может быть ошибка (Файлы и массив структур) Grizzz Общие вопросы C/C++ 3 30.09.2013 15:47
RVF файлы и с чем их едят PAKOTxx Общие вопросы Delphi 3 12.03.2012 14:15
Чем отличаются файлы??? Filimoon Безопасность, Шифрование 1 17.11.2011 15:59
В чем ошибка? (Файлы, записи) (Delphi/Pascal) Wild_klas Помощь студентам 0 21.11.2010 16:04
Чем открывать XPK Файлы, помогите? polukrovka Свободное общение 3 12.09.2008 20:36