Меню

Ошибка времени выполнения операция writeln не применима к бинарным файлам

hhaf

-8 / 0 / 0

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

Сообщений: 50

1

03.07.2017, 14:22. Показов 3859. Ответов 2

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


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var f:file of char;
l,t,p:integer;
km,pt,v:real;
begin
writeln('Введите данные для вычисления');
writeln('Введите Р-мощность двигателя');
readln(p);
writeln('Введите V-коэффицент сопротивления процессу');
readln(v);
writeln('Введите L-среднее растояние трелевки,м');
readln(l);
writeln('Введите Т-время погрузки и разгрузки пачек,с/м^3');
readln(t);
begin
km:=(17.25*l*v)/(20.7*v*l+t*p);
pt:=(2980*p)/(20.7*v*l+t*p);
 assign(f, 'e:Информатикаresult.txt');
 rewrite(f);
writeln(f,'KM=',km);
writeln(f,'ПT',pt);
 close(f);
 end;
 end.

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



0



Puporev

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

64270 / 47569 / 32739

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

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

03.07.2017, 14:28

2

Нафига file of char?
Какие символы вы хотите записывать в этот типизированный файл?

Pascal
1
var f:text;



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.

Основы программирования 2.0

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
Подробнее…

Раздел: Стандартные функции Паскаля

Процедуры 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

Как стать программистом 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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка времени выполнения инициализатор типа выдал исключение
  • Ошибка времени выполнения значение было недопустимо малым или недопустимо большим для int32