Меню

Ошибка времени выполнения входная строка имела неверный формат readln

В программе работает все, кроме удаления записи из файла

Собственно сама ошибка:

строка (254) : Ошибка времени выполнения: Входная строка имела неверный формат.

В строке 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.

TheMaker

0 / 0 / 0

Регистрация: 11.05.2020

Сообщений: 4

1

Ошибка времени выполнения: Входная строка имела неверный формат

11.05.2020, 20:24. Показов 2987. Ответов 7

Метки pascal abc (Все метки)


Добрый вечер. Писал сегодня программу по условию задачи: «Вывести на печать фамилии тех учеников, у которых есть хотя бы одна тройка, т. е. не являющихся ни отличниками, ни хорошистами.» Вот что получилось:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Program P1;
Type journal = record
   Fam: string[18];
   Rus: 2..5;
   Math: 2..5;
   Eng: 2..5
end;
Var list: array[1..8] of journal;
    i:integer; F1, F2: text;
Begin
  
  Assign(F1, 'C:10_М.txt');
  Assign(F2, 'C:SoFar.txt');
  Reset(F1);
  Rewrite(F2);
  ReadLn(F1); ReadLn(F1);
  
   For i:=1 to 8 do 
     ReadLn(F1, list[i].Fam, list[i].Rus, list[i].Math, list[i].Eng);
   For i:=1 to 8 do
     If (list[i].Rus=3) or (list[i].Math=3) or (list[i].Eng=3)then 
     begin
       WriteLn(list[i].Fam);
       WriteLn(F2, list[i].Fam)
     end;
  Close(F1); Close(F2);
end.

При этом программа выдает: «1.pas(19) : Ошибка времени выполнения: Входная строка имела неверный формат.»
Файл с таблицей прилагаю. Заранее премного благодарен.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Почетный модератор

64270 / 47569 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

11.05.2020, 20:39

2

Цитата
Сообщение от TheMaker
Посмотреть сообщение

Файл с таблицей прилагаю

Спасибо и на этом.



0



Супер-модератор

6108 / 2847 / 1299

Регистрация: 04.03.2013

Сообщений: 5,738

Записей в блоге: 1

11.05.2020, 20:39

3

TheMaker, в файле C:10_М.txt обеспечьте, чтобы было 18 символов под фамилию + 19ый символ пробел:

Код

Иванов             3 4 5
Петров             3 3 3
Сидоров            3 4 5

Добавлено через 34 секунды
Так нельзя:

Код

Иванов 3 4 5
Петров 3 3 3
Сидоров 3 4 5



0



0 / 0 / 0

Регистрация: 11.05.2020

Сообщений: 4

11.05.2020, 21:18

 [ТС]

4

ildwine, так там предусмотрен абзац.
Т.е.

Иванов
3. 4. 5
Петров
2. 4. 3

Или есть смысл писать все 1 строкой?



0



ildwine

Супер-модератор

6108 / 2847 / 1299

Регистрация: 04.03.2013

Сообщений: 5,738

Записей в блоге: 1

11.05.2020, 21:26

5

Pascal
1
ReadLn(F1, list[i].Fam, list[i].Rus, list[i].Math, list[i].Eng);

Эта строка предусматривает, что данные находятся в одной строке через пробел.



0



0 / 0 / 0

Регистрация: 11.05.2020

Сообщений: 4

12.05.2020, 10:51

 [ТС]

6

ildwine, сделал так, как вы сказали, однако проблема не исчезла. Я пробовал и расстояние между цифрами уменьшить до 1 пробела — все одно и тоже.



0



ildwine

Супер-модератор

6108 / 2847 / 1299

Регистрация: 04.03.2013

Сообщений: 5,738

Записей в блоге: 1

12.05.2020, 13:03

7

Лучший ответ Сообщение было отмечено TheMaker как решение

Решение

У меня заработало, после того как я сформировал правильный файл.
И ещё нужно убрать строку:

Pascal
1
ReadLn(F1); ReadLn(F1);

10_М.txt

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Program P1;
Type journal = record
   Fam: string[18];
   Rus: 2..5;
   Math: 2..5;
   Eng: 2..5
end;
Var list: array[1..8] of journal;
    i:integer; F1, F2: text;
Begin
  
  Assign(F1, 'D:10_М.txt');
  Assign(F2, 'D:SoFar.txt');
  Reset(F1);
  Rewrite(F2);
  
   For i:=1 to 8 do 
     ReadLn(F1, list[i].Fam, list[i].Rus, list[i].Math, list[i].Eng);
   For i:=1 to 8 do
     If (list[i].Rus=3) or (list[i].Math=3) or (list[i].Eng=3)then 
     begin
       WriteLn(list[i].Fam);
       WriteLn(F2, list[i].Fam)
     end;
  Close(F1); Close(F2);
end.



1



0 / 0 / 0

Регистрация: 11.05.2020

Сообщений: 4

14.05.2020, 17:09

 [ТС]

8

ildwine, спасибо за уделенное время.



0



Входная строка имела неверный формат паскаль

В программе работает все, кроме удаления записи из файла

Собственно сама ошибка:

строка (254) : Ошибка времени выполнения: Входная строка имела неверный формат.
В строке 254 находится (readln(menu);)

  • Вопрос задан более трёх лет назад
  • 2185 просмотров

если ты такой умный — покажи какую фразу вбить в гугля.

«pascal Ошибка времени выполнения: Входная строка имела неверный формат»
первые же три ссылки ведут на обсуждения различных вариантов возникновения данной проблемы.

пишу простую программку в паскале, до боли простую, нужно ввести скажем переменную а, объявляю ее типа как real.
var а : real;
когда скомпилировал свой код начинаю вводить данные (например значение для этой переменной 0,4) выдает ошибку: «входная строка имела неверный формат» если ввести целочисленные значения — все в норме, в чем проблема? разве тип real не включает в себя десятичные дроби ?
код программы (очень корявый, но писался чисто с целью применения на скорую руку)

program Rashet_VAH_dioda;
uses crt;
Var
a, Iz, Rst, Rd, m : real;
Io, U, Uc, Ic : integer;
const
e = 2.71;
Ft = 0.02566;
label 1;
begin
clrscr;
writeln (‘ Автор студент гр. 130611 Столяров А. Е. ‘);
1: writeln (‘введите прямой максимальный ток диода в амперах Io = ‘);
readln (Io);
writeln (‘ введите напряжение диода при температуре в вольтах 25С, Uc =’);
readln (Uc);
writeln (‘ введите ток диода при температуре в амперах 25С, Ic =’);
readln (Ic);
writeln (‘ введите напряжение расчетной точки в вольтах, U =’);
readln (U);
m := (Uc / Ln ( ((-1)*Io — Ic)/ (-1)*Io)) / Ft;
writeln (‘расчет m, m=’, m);
Iz := Io*(Exp((U/(m*Ft))*Ln(e)) — 1);
Writeln (‘значение тока Iz при заданном значении напряжения ‘,Iz);
Rst := Iz / U;
writeln (‘ Статическое сопротивление Rст = ‘, Rst);
Rd := (m*Ft)/(Io — Iz);
writeln (‘дифференциальное сопротивление Rдиф =’, Rd);
if Iz > Io then
begin
Writeln (‘максимальный ток превышен, диод красиво сгорел’);
goto 1 ;
end;
Writeln (‘для сброса и повторения нажмите 1’);
readln (a);
if a = 1 then goto 1;
End.

Программа читает файл и печатает содержимое на экран.

Но при попытке запустить PascalABC.NET говорит:

В чем может быть ошибка? Содержимое входного файла:

2 ответа 2

Рискну предположить, что readln гордо считал «mynamw 334» в s , и дальше не смог найти ничего похожего на i . Откуда ему знать, где заканчивается ваша строка и есть ли в ней пробелы? Попробуйте заменить это на просто readln(f, s); i := 100; и посмотреть, что будет.

Итак, проблему нашли. А можно переставить местами данные:

Если да, то всё получится с readln(f, i, s); .

Поскольку мы решили не менять формат, задача становится сложнее 🙂 Я бы считал всю строку в строковую переменную ( readln(f, line); ), а дальше нашёл бы в ней последний пробел (поиском с конца) и разделил по нему на s (подстрока от начала до позиции найденного пробела) и i (остаток строки, перевести в число с помощью StrToInt ). Понятно, как?

Skip to content

Главная » Информатика — 5 — 9 классы

формат» в строке readln(s) в этой программе:

var s:integer; c:char;
begin
writeln(‘Введите символ s’);
readln(s);
s:= ordAnsi(c);
writeln(‘Код введённого символа — ‘, s);
end​

Ответ №1

Ответ:

Объяснение:

Во-первых, если Вы пишете в PascalABC.NET, можно писать это проще и короче, не заморачиваясь с типами данных.

begin

 var c := ReadlnChar(‘Введите символ s’);

 var s := OrdAnsi(c);

 Writeln(‘Код введённого символа — ‘, s)

end.

Во-аторых, если Вы все же хотите в современном PascalABC.NET писать, как в Delphi образца 2005 года, пишите хотя бы правильно:

var

 s:integer;

 c:char;

begin

 writeln(‘Введите символ s’);

 readln(c);

 s:= ordAnsi(c);

 writeln(‘Код введённого символа — ‘, s);

end.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка времени выполнения unable to read beyond the end of the stream
  • Ошибка времени выполнения system indexoutofrangeexception индекс находился вне границ массива стек