|
hhaf -8 / 0 / 0 Регистрация: 02.06.2017 Сообщений: 50 |
||||
|
1 |
||||
|
03.07.2017, 14:22. Показов 3859. Ответов 2 Метки нет (Все метки)
__________________
0 |
|
Puporev Почетный модератор 64270 / 47569 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
|
03.07.2017, 14:28 |
2 |
|||
|
Нафига file of char?
0 |
|
128 / 126 / 107 Регистрация: 09.01.2017 Сообщений: 1,651 |
|
|
03.07.2017, 14:29 |
3 |
|
А если уж нужен бинарный файл,то тогда только write
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
03.07.2017, 14:29 |
|
3 |
Topic: Error: Can’t use readln or writeln on typed file (Read 6639 times)
Why have i next error: Error: Can’t use readln or writeln on typed file
program PERSONEELGEGEVENS_SAVE;
{$mode objfpc}
type personeel=record
nr:integer;
naam, adres, postcode, plaats:String;
wedde:Integer;
end;
Var F:File of personeel;
Var persoon: personeel;
Var B_NAAM: String;
begin
writeln('Welkom in programma *Personeelgegevens*!');
writeln();
writeln('Geef de bestandsnaam in:');
readln(B_NAAM);
Assign(F, B_NAAM);
Rewrite(F);
writeln();
writeln('Geef de personeelsnummer in (0 => stoppen):');
readln(PERSOON.NR);
while (PERSOON.NR <> 0) do
begin
writeln('Naam:');
readln(PERSOON.NAAM);
writeln('Aders:');
//
readln(PERSOON.ADRES);
writeln('Postcode:');
//
readln(PERSOON.POSTCODE);
writeln('Plaats');
//
readln(PERSOON.PLAATS);
writeln('Wedde');
//
readln(PERSOON.WEDDE);
//
writeln(F, PERSOON);
writeln('Geef de personeelsnummer in (0 => stoppen):');
readln(PERSOON.NR);
end;
//
Close(F);
writeln();
writeln('Druk op <ENTER> om programma te verlaten');
readln();
end.

Logged
You can only use readln and writeln on text files.
Use Read and Write instead.

Logged
All posts based on: Win10 (Win64); Lazarus 2.0.10 ‘stable’ (x64) unless specified otherwise…
Yes, it’s true. I’ve changed
writeln(F, PERSOON); to
write(F, PERSOON);
and this code works perfect. Thank you.

Logged
Во-первых, ваш код работает. Ошибка возможна потому, что не находит файл или он занять другим процессом.
Во — вторых, раз это PascalABC.Net, то почему бы не писать в его стиле
const
filename = 'dat.txt';
var
f: Text; // Файловая переменная.
i: integer; // Переменная для хранения значения количества подсчитываемых элементов.
a: real; // Промежуточная переменная для хранения значения читаемых элементов.
sum: real;// переменная для хранения значения произведения.
begin
// Rewrite(f, filename);
// f.Writeln(2);
// f.Writeln(7);
// f.Close();
f := OpenRead(filename);
i := 0; // Установка счетной переменной в нулевое состояние.
sum := 0;
while not f.Eof do // Цикл для поэлементного чтения из файла.
begin
a := f.ReadlnReal(); // Чтение информации из файла.
write(a:8:2);
sum := sum + a;
inc(i);
end;
f.Close();
writeln;
writeln('The number of extracted numbers from the file is: ', i);
writeln('Summa numbers from a file is equal to: ', sum:0:2);
readln;
end.
В программе работает все, кроме удаления записи из файла
Собственно сама ошибка:
строка (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.
|
|
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее… |
Раздел: Стандартные функции Паскаля
Процедуры Write и WriteLn выполняют вывод информации в устройство стандартного вывода. В консольных приложениях этим устройством может быть консоль (то есть экран), в графических приложениях — файл на диске.
Эти процедуры выполняют одно и то же действие. Отличие между ними только одно:
процедура WriteLn после завершения вывода выполняет перевод
строки. А процедура Write записывает данные подряд — без перевода строки.
Синтаксис для вывода на консоль:
procedure Write(Args : Arguments);
Синтаксис для вывода в файл:
procedure Write(var F: Text; Args : Arguments);
Аргументами (Arguments) могут быть переменные разных
типов.
Если используется несколько переменных, то они перечисляются через запятую. Например:
var x, y, z : integer;
str : string;
begin
x := 1; y := 2; z := 3;
str := ' - Numbers';
Write(x, y, z, str);
ReadLn;
end.
Причём, как уже было сказано, при выводе на консоль эти переменные могут быть разных типов. Также можно использовать и константы:
Write('Numbers - ', x, y, z, 100);
Если требуется перевод строки, то лучше использовать функцию WriteLn вместо Write:
WriteLn(x, y, z, str); //Выводим данные и переводим строку
Write('Numbers - ', x, y, z); //Это будет уже в новой строке
Но можно использовать, например, символы перевода строки в конце списка аргументов:
Write('Numbers - ', x, y, #10#13); //Этот код тоже выполнит
//перевод строки
Write('Numbers - ', x, y, z); //Это тоже будет уже
//в новой строке
При записи в файл можно работать как с типизированными файлами, так и с текстовыми файлами.
Если F (см. синтаксис) — это типизированный файл, то переменные,
передаваемые как параметры (Args) должны иметь такой же тип, какой указан
для файла F. Нетипизированные файлы использовать не допускается.
Если параметр F не указан, то предполагается, что вывод
выполняется на стандартное устройство (экран-консоль).
Если файл F имеет тип Text, то все необходимые
преобразования будут выполнены таким образом, что выходная переменная будет
в удобочитаемом формате. Это преобразование выполняется для всех числовых типов.
Строки и типы PChar выводятся точно так, как они находятся в памяти.
При выводе на консоль целые
числовые значения выводятся в обычном числовом формате. А вещественные числовые значения по умолчанию выводятся в научной нотации.
Чтобы выводить целые числа в поля фиксированной ширины или вещественные числа с
фиксированным количеством знаков после запятой, используется специальный формат
вывода. Но об этом в данной статье я говорить не буду, так как уже рассказывал
об этом здесь.
Если во время выполнения процедуры Write/WriteLn происходит
ошибка, то генерируется ошибка времени выполнения. Такое поведение не всегда
приемлемо (например, во время чтения/записи файла). Поэтому в каких-то случаях
генерацию ошибок отключают. Сделать это можно с помощью
директивы компилятора {$I}.
|
|
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… |
|
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. |
Я не могу найти источник этой ошибки, которую постоянно получаю в школьном кодировании. Каждый раз, когда я ввожу одно значение в свой массив и запускается цикл for, он либо обнаруживает ошибку времени выполнения, либо остальная часть программы запускается на основе информации из первого значения и не принимает никаких других значений. Может кто-нибудь объяснить мне, как это исправить?
program Montserrat_Elections;
Var cndnme : array [1..4] of String;
votes : array [1..4] of Integer;
highest, cnt : Integer;
winner : string;
begin
highest:= 0;
winner:= 'Dan';
For cnt:= 1 to 4 do
begin
Writeln('Please enter the first name of the candidate and the number of votes');
Read (cndnme[cnt], votes[cnt]);
If votes[cnt] > highest then
highest := votes[cnt];
winner := cndnme[cnt];
end;
Writeln('The winner of this constituency is', winner, 'with', highest, 'votes')
end.
1 ответ
Лучший ответ
Измените Чтение на Чтение :
Readln (cndnme[cnt], votes[cnt]);
Затем вам нужно добавить begin … end; к этой строке:
If votes[cnt] > highest then
begin
highest := votes[cnt];
winner := cndnme[cnt];
end;
Я обновляю и тестирую ваши коды:
program Montserrat_Elections;
Var cndnme : array [1..4] of String;
votes : array [1..4] of Integer;
highest, cnt : Integer;
winner : string;
begin
highest:= 0;
winner:= 'Dan';
For cnt:= 1 to 4 do
begin
Writeln('Please enter the first name of the candidate and the number of votes');
readln(cndnme[cnt], votes[cnt]);
If votes[cnt] > highest then
begin
highest := votes[cnt];
winner := cndnme[cnt];
end;
end;
Writeln('The winner of this constituency is ', winner, ' with ', highest, ' votes');
readln;
end.
Результат:
Please enter the first name of the candidate and the number of votes
Me
23
Please enter the first name of the candidate and the number of votes
You
42
Please enter the first name of the candidate and the number of votes
Ainun
18
Please enter the first name of the candidate and the number of votes
Jhon
38
The winner of this constituency is You with 42 votes
1
Metris Sovian
27 Янв 2017 в 06:42


