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

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


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

334 mynamw
334 myeemw
334 mynrrramw

?

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


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

nokados

27 / 27 / 9

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

Сообщений: 132

1

25.10.2013, 17:52. Показов 9151. Ответов 4

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


Студворк — интернет-сервис помощи студентам

Вот код:
Объявление переменных:

Pascal
1
2
3
4
5
6
7
8
const N=30;
type student = record
  fio:string[15];
  notes:array[1..15] of integer;
  mid:real;
 end;
 var s,i,j:integer;
     people:array[1..N] of student;

Ввод

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
for i:=1 to N do
  begin
    read(people[i].fio);
    s:=0;
    for j:=1 to 15 do
    begin
      read(people[i].notes[j]);
      s:=s+people[i].notes[j];
    end;
    people[i].mid:=s/15;
    writeln();
  end;

Выдает ошибку в строке

Pascal
1
read(people[i].notes[j]);

Как исправить?

Вводил вот так:

Код

орвап 1 2 2 3 3 5 5 5 5 5 5 5 5 5 5
ool 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
Ошибка времени выполнения: System.FormatException: Входная строка имела неверный формат.
Стек:
   в PABCSystem.PABCSystem.read(Int32& x)
   в notes.Program.$Main() в C:UsersНикитаDesktopnotes.pas:строка 17
   в notes.Program.Main()



0



993 / 521 / 102

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

Сообщений: 3,113

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

25.10.2013, 17:58

2

мб из-за того что fio:string[15];

и читает из орвап 1 2 2 3 3 5 5 5 5 5 5 5 5 5 5 в орвап 1 2 2 3 3

Хотя хз



0



27 / 27 / 9

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

Сообщений: 132

25.10.2013, 17:59

 [ТС]

3

а как тогда сделать, чтобы до пробела читалось?



0



993 / 521 / 102

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

Сообщений: 3,113

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

25.10.2013, 18:01

4

а зачем в одной строке всё. Почему бы не разбить на два ввода.

1. Читаем и сохраняем строку
2. читаем и сохраняем числовой массив



0



nokados

27 / 27 / 9

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

Сообщений: 132

25.10.2013, 18:25

 [ТС]

5

Для наглядности. Или Pascal и эстетичность никак не пересекаются?

Добавлено через 14 минут
Проблему решил, написав такую функцию:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
function tospace():string;
var c:char;
    s:string;
begin
  c:='-';
  while c<>' ' do
  begin
    s:=s+c;
    read(c);
  end;
  tospace:=s;
end;

и заменив

Pascal
1
read(people[i].fio);

на

Pascal
1
people[i].fio:=tospace();



0



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


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

334 mynamw
334 myeemw
334 mynrrramw

?

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


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

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

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

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

Узнай цену своей работы

Формулировка задачи:

Вот код:

Объявление переменных:

Ввод

Выдает ошибку в строке

Как исправить?

Вводил вот так:

Код к задаче: «Некорректно работает read — Ошибка времени выполнения: Входная строка имела неверный формат»

textual

Листинг программы

people[i].fio:=tospace();

Полезно ли:

8   голосов , оценка 4.000 из 5

Похожие ответы

  1. Вывести на экран все русские согласные буквы строки в алфавитном порядке.
  2. Найти номер первого символа строки, нарушающего алфавитный порядок
  3. Упорядочить элементы последней строки матрицы по убыванию
  4. Ввести строку. Удалить часть символьной строки, заключенной между запятыми.
  5. Составить процедуру Stars, которая по данному N выводит на экран строку из N символов *
  6. Работа со строками, нахождение слов в txt
  7. Вывод сообщения если строка пустая после выполнения алгоритма
  8. Напишите программу, которая находит все различные цифры в символьной строке
  9. Вывести пять строк разной длины из разных цифр
  10. Удалить из массива строку и столбец, на пересечении которых находится минимальный элемент
  11. Выдает ошибку

  • Re2 exe неустранимая ошибка приложения 0x887a0006
  • Read handshake record ошибка
  • Re00w ошибка батареи hp
  • Read from disk ошибка торрента как исправить
  • React сообщение об ошибке