Рискну предположить, что 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 Метки нет (Все метки)
Вот код:
Ввод
Выдает ошибку в строке
Как исправить? Вводил вот так: Код орвап 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. Читаем и сохраняем строку
0 |
nokados 27 / 27 / 9 Регистрация: 30.04.2012 Сообщений: 132 |
||||||||||||
25.10.2013, 18:25 [ТС] |
5 |
|||||||||||
Для наглядности. Или Pascal и эстетичность никак не пересекаются? Добавлено через 14 минут
и заменив
на
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
Похожие ответы
- Вывести на экран все русские согласные буквы строки в алфавитном порядке.
- Найти номер первого символа строки, нарушающего алфавитный порядок
- Упорядочить элементы последней строки матрицы по убыванию
- Ввести строку. Удалить часть символьной строки, заключенной между запятыми.
- Составить процедуру Stars, которая по данному N выводит на экран строку из N символов *
- Работа со строками, нахождение слов в txt
- Вывод сообщения если строка пустая после выполнения алгоритма
- Напишите программу, которая находит все различные цифры в символьной строке
- Вывести пять строк разной длины из разных цифр
- Удалить из массива строку и столбец, на пересечении которых находится минимальный элемент
- Выдает ошибку