V
V
vitfan2015-12-29 23:14:38
Pascal
vitfan, 2015-12-29 23:14:38

Pascal(Runtime error input string was malformed)?

Everything works in the program, except for deleting the record from the file.
Actually, the error itself:
line (254) : Run-time error: The input line had an incorrect format.
Line 254 contains (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 show(a: file of abonent);
begin
  reset(a);
  ind := 1;   //номер строки в выводимой таблице
  while not eof(a) do
  begin
    read(a, x);   //чтение записи из файла
    write(ind, ': ');  //номер строки в выводимой таблице
    ind := ind + 1;
    with x do
      //вывод считаной записи на экран
      writeln(number, ' ', FIO, ' ', adres.street, ' ', adres.house, ' ', adres.flat, ' ', date);
  end;
  if FileSize(a) = 0 then write('Файл пуст. Пожалуйста добавьте записи!');
  writeln;
  close(a);
end;


//Процедура добавления новой записи в конец файла
procedure add(a: file of abonent);
label nachalo;//метка начала процедуры
begin
  nachalo:      //метка начала процедуры
  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;
  reset(a);
  seek(a, FileSize(a)); //перевод указателя в конец файла
  write(a, x);  //запись переменной в файл
  writeln('Абонент успешно добавлен.');
  writeln;
  writeln('Добавить еще одного? (y/n):');
  readln(yn);
  if yn = 'y' then goto nachalo;
  close(a);
end;


//Процедура удаления записи из файла
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);
  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);
  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.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
E
Evgeny Elchev, 2015-12-30
@rsi

if you are so smart - show me what phrase to drive into Google.

"pascal Runtime Error: Input string was malformed" The
first three links lead to discussions of various ways in which this problem can occur.
PS: every time I visit this resource, I promise to control myself, but a thousand devils, don’t drive the verbatim error text into Google, and then the translation, if it doesn’t help, but climb on the toaster and write sarcastic comments, rly? Are you serious about programming? I'll tell you a secret, this profession involves the ability to move gears and the level of this skill directly correlates with the level and, accordingly, the payment of a specialist.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question