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

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

Ze7ra

0 / 0 / 0

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

Сообщений: 6

1

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

27.04.2016, 22:43. Показов 37937. Ответов 7

Метки нет (Все метки)


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

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Program Ex2_2;
Uses Crt;
Var
  f: text;
  c: real;
Begin
  ClrScr;
  Assign(f, 'ex2.txt');
  Reset(f);
  Writeln('В последовательности:');
  While not eof(f) do
    begin
      Read(f, c); <- Вот эту
      Write(c, ' ');
    end;
  Writeln;
  Close(f);
End.

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



0



93 / 11 / 23

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

Сообщений: 34

28.04.2016, 07:23

2

Файл покажите, на котором проверяли свой код. Есть у меня догадка, что дело именно в нём: скорее всего число типа real в нём записано не совсем верно.



0



Ze7ra

0 / 0 / 0

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

Сообщений: 6

28.04.2016, 12:55

 [ТС]

3

WindAndRain, да, дело, видимо в нем. Но что-то до меня не доходит как тогда исправить сам код или тип переменной, чтобы такой ошибки не выходило. Вот код самого файла:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Program Ex2_2;
Uses Crt;
Var
  f: text;
  c: real;
  p: char;
  n, i: integer;
Begin
  ClrScr;
  Assign(f, 'ex2.txt');
  Rewrite(f);
  Write('Сколько чисел в последовательности: '); Readln(n);
  p:=' ';
  For i:=1 to n do
    begin
      Write('Введите ', i, ' число:');
      Readln(c);
      Write(f, c, p);
    end;
  Writeln;
  Writeln('Файл заполнен');
  Close(f);
End.

Если что, прикреплю еще задание, которое нужно сделать. Помогать с ним не прошу, но очень хочется понять, что делать с этой ошибкой, спасибо:

«В текстовом файле записана непустая последовательность действительных чисел, разделенных пробелами (пробелов может быть больше одного). Написать функцию для нахождения наибольшего из этих чисел.»



0



318 / 208 / 162

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

Сообщений: 863

28.04.2016, 13:02

4

Вас же попросили,

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

Файл покажите,

, и тогда дойдет хотя бы до нас, что вам ответить на вопрос «как исправить».
Имеется ввиду текстовый файл ваш с данными.



0



0 / 0 / 0

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

Сообщений: 6

28.04.2016, 13:08

 [ТС]

5

Я думала весь смысл был именно в коде, которым я заполняла файл, но ладно.
Текстовый файлик, состоящий всего из 15 цифр с пробелами:
8 9 6 5 4 78 54 21 9 85 35 21 48 65 97



0



0 / 0 / 0

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

Сообщений: 6

28.04.2016, 13:17

 [ТС]

6

Вот файл



0



318 / 208 / 162

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

Сообщений: 863

28.04.2016, 14:03

7

убрать пробел в конце строки. Нужно подправить чтение, чтобы не зависело от пробелов.



0



Puporev

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

64272 / 47571 / 32739

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

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

28.04.2016, 15:29

8

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

Решение

Читать текстовый файл с числами и пробелами

Pascal
1
2
3
4
5
6
7
Reset(f);
While not seekeof(f) do
 begin
  Read(f, c);
  Write(c:0:2,' ');//если числа вещественные
 end;
Close(f);



1



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

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

строка (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 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.

Наши новости:

Раскрутка Counter-Strike 1.6

Помощь в паскале

, сортировка массива пузырьком

Статус пользователя

looks12

сообщение
21.6.2014, 19:30

Сообщение
#1



Выдаёт ошибку:
Program1.pas(12) : Ошибка времени выполнения: Входная строка имела неверный формат.
Код:

program massbouble;
var
f:text;
buf:array [0..20] of integer;
i,j,z,temp:integer;
begin
assign(f,'input.txt');
reset(F);
i:=0;
while (not eof(f)) do
begin
read(f,buf[i]);
i:=i+1
end;
for j:=0 to i-1 do
for z:=0 to i-j-1 do
begin
if buf[z]<buf[z-1]
then
begin
temp:=buf[z];
buf[z]:=buf[z-1];
buf[z-1]:=temp;
end;
close(F);
end;
assign (f,'output.txt');
rewrite (F);
for j:=0 to i-1 do
write (f,buf[j]);
close (F);
end.

Отредактировал: looks12, — 21.6.2014, 19:32

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

Цитировать сообщение

Статус пользователя

Revelation

сообщение
21.6.2014, 19:33

Сообщение
#2

Стаж: 10 лет

Сообщений: 1051

Благодарностей: 401

Полезность: 1075


Содержимое input.txt ?

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

looks12

сообщение
21.6.2014, 19:37

Сообщение
#3

Стаж: 10 лет

Сообщений: 305

Благодарностей: 51

Полезность: 172

Меценат Меценат


Цитата(Revelation @ 21.6.2014, 20:33) *

Содержимое input.txt ?

20 19 18 1 5 2 4 3 6 8 7 9 17 15 16 10 12 11 13 14

Теперь
Program1.pas(18) : Ошибка времени выполнения: Индекс находился вне границ массива.

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

looks12

сообщение
21.6.2014, 20:08

Сообщение
#4

Стаж: 10 лет

Сообщений: 305

Благодарностей: 51

Полезность: 172

Меценат Меценат


А где крутые хацкеры или дудосеры?

Отредактировал: looks12, — 21.6.2014, 20:08

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

Predat0r

сообщение
21.6.2014, 20:09

Сообщение
#5

Стаж: 11 лет

Сообщений: 1245

Благодарностей: 375

Полезность: < 0


На cyberforum’e

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

Поблагодарили 2 раз

+

Цитировать сообщение

Esecman

сообщение
21.6.2014, 20:19

Сообщение
#6

Стаж: 9 лет 1 месяц

Сообщений: 945

Благодарностей: 208

Полезность: 0


Цитата(Predat0r @ 21.6.2014, 21:09) *

На cyberforum’e

Оффтоп:
Predator,
Хах. Так ты же вроде хвастался, что Pascal учит логике и все такое.
А почему не выучил то?

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

Predat0r

сообщение
21.6.2014, 21:04

Сообщение
#7

Стаж: 11 лет

Сообщений: 1245

Благодарностей: 375

Полезность: < 0


Цитата(Esecman @ 21.6.2014, 21:19) *

Хах. Так ты же вроде хвастался, что Pascal учит логике и все такое.

Как я мог такое сказать, если паскаль говн%?

Отредактировал: Predat0r, — 21.6.2014, 21:12

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

Поблагодарили 4 раз

+

Цитировать сообщение

Статус пользователя

nsgenn

сообщение
22.6.2014, 5:17

Сообщение
#8

Стаж: 9 лет 9 месяцев

Сообщений: 885

Благодарностей: 561

Полезность: 667


как бэ символы, которые читаются имеют формат CHAR, а не Integer
индекс вне границ массива — естественно, ибо читается каждый символ:

(20) = 2символа + пробел =3
(19) = 2 +пробел = 3
и т.д..
зы. Еще у тебя «close» в цикле весит, отсюда еще одна ошибка

короче ошибок уйма

Отредактировал: nsgenn, — 22.6.2014, 5:28

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

looks12

сообщение
22.6.2014, 8:10

Сообщение
#9

Стаж: 10 лет

Сообщений: 305

Благодарностей: 51

Полезность: 172

Меценат Меценат


Цитата(nsgenn @ 22.6.2014, 6:17) *

как бэ символы, которые читаются имеют формат CHAR, а не Integer
индекс вне границ массива — естественно, ибо читается каждый символ:

(20) = 2символа + пробел =3
(19) = 2 +пробел = 3
и т.д..
зы. Еще у тебя «close» в цикле весит, отсюда еще одна ошибка

короче ошибок уйма

Спасибо, но уже нашёл и исправил ошибки.
Да паскаль не радость на задача была поставлена и её надо было решить.

Отредактировал: looks12, — 22.6.2014, 8:11

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

nsgenn

сообщение
22.6.2014, 8:44

Сообщение
#10

Стаж: 9 лет 9 месяцев

Сообщений: 885

Благодарностей: 561

Полезность: 667


Цитата(looks12 @ 22.6.2014, 10:10) *

Да паскаль не радость на задача была поставлена и её надо было решить.

Вы еще с асмом не знакомились. Попривыкали к халявному алфавиту ))

Отредактировал: nsgenn, — 22.6.2014, 8:45

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

Статус пользователя

looks12

сообщение
22.6.2014, 9:09

Сообщение
#11

Стаж: 10 лет

Сообщений: 305

Благодарностей: 51

Полезность: 172

Меценат Меценат


Цитата(nsgenn @ 22.6.2014, 9:44) *

Вы еще с асмом не знакомились. Попривыкали к халявному алфавиту ))

В KOI-то века знакомился с данным господином.

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение

+

Цитировать сообщение

0 пользователей и 1 гостей читают эту тему:

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

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

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

строка (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 ). Понятно, как?

Понравилась статья? Поделить с друзьями:
  • Program will be terminated call to arms как исправить windows 10
  • Program will be terminated app error unable to create the swap chain
  • Program will be terminated app error resource
  • Program will be terminated app error pattern not found
  • Program will be terminated app error failed to allocate memory requested