Pascal (input time error was incorrect)



  • Everything works in the program, except to remove the record from the file.

    In fact, the mistake itself is:

    Line (254): Time error: The entry line had an incorrect format.

    In line 254 (readln(menu);)

      program Telophonia;
    

    type
    abonent = record
    number: string[10]; //Номер телефона
    FIO: string[40]; //ФИО абонента
    adres: record //Адрес абонента в виде другой записи состоящий из:
    street: string[20]; //Улица
    house: string[20]; //Дом
    flat: string[20]; //Квартира
    end;
    date: string[10]; //Дата подключения абонента
    end;

    var
    abonents: file of abonent; //Файл содержащий записи об абонентах
    x, t: abonent; //Вспомогательная переменная типа записи об абонентах
    menu, ind, cnt: integer; //Вспомогательные переменные для меню, индексации и счетчика записей в некоторых процедурах
    yn: char; //Переменная y/n ответов
    filename: string[25]; //Имя файла, задаваемое пользователем
    nmbr: string[10]; //Вспомогательная переменная для номера абонента

    //Процедура удаления записи из файла
    procedure del(a: file of abonent);
    label nachalo,ex;//метка начала и конца процедуры
    begin
    nachalo: //метка начала процедуры
    reset(a);
    write('Введите номер:');
    read(nmbr);
    cnt := 0; //ведем счет записей из файла, чтобы в дальнейшем обратиться к нужной считанной записи и удалить ее
    repeat //просматривать файл на совпадение номера абонента
    if eof(a) then //если дошли до конца и не нашли нужного абонента
    begin
    writeln('Абонента с таким номером не существует!');
    write('Найти по другому номеру? (y/n):');
    readln(yn);
    if yn = 'y' then goto nachalo else goto ex;
    end;
    read(a, t); //чтение записи из файла
    cnt := cnt + 1; //увеличиваем счетчик записей на один
    until t.number = nmbr;
    writeln('Найденный абонент:');
    writeln(t.number, ' ', t.FIO, ' ', t.adres.street, ' ', t.adres.house, ' ', t.adres.flat, ' ', t.date);
    writeln;
    writeln('Удалить данные об абоненте? (y/n):');
    readln(yn);
    if yn <> 'y' then goto ex;
    cnt := cnt - 1;
    while not eof(a) do
    begin
    if filesize(a)=cnt+1 then break;
    seek(a, cnt+1); //перевод указателя на следующий элемент
    read(a, t);
    seek(a, cnt); //перевод указателя на удаляемого абонента
    write(a, t); //перезапись следующего абонента из файла на место удаляемого
    cnt := cnt + 1;
    seek(a, cnt); //перевод указателя на следующую за переписанным абонентом
    end;
    seek(a, filesize(a) - 1); //перевод указателя на последнюю запись в файле
    truncate(a); //удаление последней записи в файле
    writeln('Данные удалены');
    write('Найти по другому номеру? (y/n):');
    readln(yn);
    if yn = 'y' then goto nachalo;
    ex: //метка выхода из процедуры
    close(a);
    end;

    //Процедура корректировки записи в файле
    procedure edit(a: file of abonent);
    label nachalo,ex;//метки начала процедуры и выхода из нее
    begin
    reset(a);
    nachalo: //метка начала процедуры
    write('Введите номер абонента:');
    read(nmbr);
    cnt := 0; //ведем счет записей из файла, чтобы в дальнейшем обратиться к нужной считанной записи и перезаписать ее
    yn:='n';
    while not eof(a) do
    begin
    read(a, t); //чтение записи из файла
    cnt:= cnt + 1; //увеличиваем счетчик записей на один
    if t.number = nmbr then break;
    end;
    if eof(a) then //если дошли до конца и не нашли нужного абонента
    begin
    writeln('Абонента с таким номером не существует!');
    write('Найти по другому номеру? (y/n):');
    readln(yn);
    if yn = 'y' then goto nachalo else goto ex;
    end;
    cnt := cnt - 1; //возвращаемся к предыдущей записи, чтобы ее изменить
    writeln('Изменить данные об абоненте? (y/n):');
    readln(yn);
    readln(yn);
    if yn <> 'y' then goto ex;
    with x do
    begin
    repeat //просматривать файл на совпадение номера абонента
    write('Номер абонента = ');
    readln(number);
    reset(a);
    while not eof(a) do
    begin
    read(a, t); //чтение записи из файла
    if t.number = number then
    begin
    writeln('Абонент с таким номером уже существует!');
    break; //выходим из цикла while и повторяем сначала
    end;
    end;
    until t.number <> number;
    write('ФИО = ');
    readln(FIO);
    write('Улица = ');
    readln(adres.street);
    write('Дом = ');
    readln(adres.house);
    write('Квартира = ');
    readln(adres.flat);
    write('Дата подключения = ');
    readln(date);
    writeln;
    end;
    writeln('Изменить данные об абоненте? (y/n):');
    readln(yn);
    readln(yn);
    if yn <> 'y' then goto ex;
    seek(a, cnt);
    write(a, x); //запись переменной в файл
    writeln('Изменения приняты.');
    WriteLn;
    writeln('Найти по другому номеру? (y/n):');
    readln(yn);
    if yn = 'y' then goto nachalo;
    ex: //метка выхода из процедуры
    close(a);
    end;
    //Процедура вывода содержимого файла на экран
    procedure find(a: file of abonent);
    label nachalo;
    begin
    nachalo:
    with x do
    begin
    write('Номер абонента = ');
    readln(number);
    reset(a);
    cnt := 0; //ведем счет удовлетворяющих запросу записей
    while not eof(a) do
    begin
    read(a, t); //чтение записи из файла
    if t.number = number then
    begin
    writeln('Найдено:');
    writeln(number, ' ', FIO, ' ', adres.street, ' ', adres.house, ' ', adres.flat, ' ', date);
    cnt := cnt + 1;
    break;
    end;
    end;
    end;
    if cnt=0 then writeln('Не найдено абонента с таким номером.');
    writeln;
    writeln('Найти по другому номеру? (y/n):');
    readln(yn);
    if yn = 'y' then goto nachalo;
    close(a);
    end;

    begin
    write('Введите имя файла: ');
    readln(filename);
    assign(abonents, filename);
    repeat
    writeln('1: Вывести содержимое');
    writeln('2: Добавить абонента');
    writeln('3: Удалить абонента');
    writeln('4: Изменить данные абонента');
    writeln('5: Найти по номеру');
    writeln('0: Выход');
    write('Выберите действие: ');
    readln(menu);
    writeln;
    case menu of
    1: show(abonents);
    2: add(abonents);
    3: del(abonents);
    4: edit(abonents);
    5: find(abonents);
    end;
    until menu = 0;
    end.



  • The error arises because of the procedure del for variable reading read(nmbr); instead readln(nmbr);That's why readln(yn); counts an empty line. Thus readln(menu); "y" or "n," which is char at a time when readln(menu); waiting integer.

    Read procedure

    Read shall read all symbols before (but not including) the next end marker Lines or as long as Eof(F) is equal to True. Read doesn't go to next line after reading. If the resulting line Longer than maximum string variable length, it's It's working. After the first Read, every subsequent Read challenges will be See the marker end of the line and return the line of zero length.

    http://www.pascal.helpov.net/index/pascal_Read


Log in to reply
 


Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2