Ze7ra 0 / 0 / 0 Регистрация: 24.10.2015 Сообщений: 6 |
||||
1 |
||||
Входная строка имела неверный формат27.04.2016, 22:43. Показов 37937. Ответов 7 Метки нет (Все метки)
Здравствуйте. Небольшая загвоздочка вышла, не понятная мне. Не мог бы кто-нибудь подсказать в чем дело, пожалуйста?
__________________
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, да, дело, видимо в нем. Но что-то до меня не доходит как тогда исправить сам код или тип переменной, чтобы такой ошибки не выходило. Вот код самого файла:
Если что, прикреплю еще задание, которое нужно сделать. Помогать с ним не прошу, но очень хочется понять, что делать с этой ошибкой, спасибо: «В текстовом файле записана непустая последовательность действительных чисел, разделенных пробелами (пробелов может быть больше одного). Написать функцию для нахождения наибольшего из этих чисел.»
0 |
318 / 208 / 162 Регистрация: 08.12.2015 Сообщений: 863 |
|
28.04.2016, 13:02 |
4 |
Вас же попросили,
Файл покажите, , и тогда дойдет хотя бы до нас, что вам ответить на вопрос «как исправить».
0 |
0 / 0 / 0 Регистрация: 24.10.2015 Сообщений: 6 |
|
28.04.2016, 13:08 [ТС] |
5 |
Я думала весь смысл был именно в коде, которым я заполняла файл, но ладно.
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 как решение РешениеЧитать текстовый файл с числами и пробелами
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.
Наши новости: |
Помощь в паскале, сортировка массива пузырьком
|
looks12 |
Сообщение
|
|
Выдаёт ошибку: program massbouble; Отредактировал: looks12, — 21.6.2014, 19:32 |
|
|
Revelation |
Сообщение
|
Стаж: 10 лет Сообщений: 1051 |
Содержимое input.txt ? |
|
|
looks12 |
Сообщение
|
Стаж: 10 лет Сообщений: 305 Меценат |
Цитата(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 Теперь |
|
|
looks12 |
Сообщение
|
Стаж: 10 лет Сообщений: 305 Меценат |
А где крутые хацкеры или дудосеры? Отредактировал: looks12, — 21.6.2014, 20:08 |
|
|
Predat0r |
Сообщение
|
Стаж: 11 лет Сообщений: 1245 |
На cyberforum’e |
|
Поблагодарили 2 раз
|
Esecman |
Сообщение
|
Стаж: 9 лет 1 месяц Сообщений: 945 |
Цитата(Predat0r @ 21.6.2014, 21:09) На cyberforum’e Оффтоп: |
|
|
Predat0r |
Сообщение
|
Стаж: 11 лет Сообщений: 1245 |
Цитата(Esecman @ 21.6.2014, 21:19) Хах. Так ты же вроде хвастался, что Pascal учит логике и все такое. Как я мог такое сказать, если паскаль говн%? Отредактировал: Predat0r, — 21.6.2014, 21:12 |
|
Поблагодарили 4 раз
|
nsgenn |
Сообщение
|
Стаж: 9 лет 9 месяцев Сообщений: 885 |
как бэ символы, которые читаются имеют формат CHAR, а не Integer (20) = 2символа + пробел =3 короче ошибок уйма Отредактировал: nsgenn, — 22.6.2014, 5:28 |
|
|
looks12 |
Сообщение
|
Стаж: 10 лет Сообщений: 305 Меценат |
Цитата(nsgenn @ 22.6.2014, 6:17) как бэ символы, которые читаются имеют формат CHAR, а не Integer (20) = 2символа + пробел =3 короче ошибок уйма Спасибо, но уже нашёл и исправил ошибки. Отредактировал: looks12, — 22.6.2014, 8:11 |
|
|
nsgenn |
Сообщение
|
Стаж: 9 лет 9 месяцев Сообщений: 885 |
Цитата(looks12 @ 22.6.2014, 10:10) Да паскаль не радость на задача была поставлена и её надо было решить. Вы еще с асмом не знакомились. Попривыкали к халявному алфавиту )) Отредактировал: nsgenn, — 22.6.2014, 8:45 |
|
|
looks12 |
Сообщение
|
Стаж: 10 лет Сообщений: 305 Меценат |
Цитата(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 ). Понятно, как?