Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 07.03.2022
Сообщений: 3

Ошибка времени выполнения: Чтение после конца потока невозможно. Задача reals = file of real

16.04.2022, 11:25. Показов 545. Ответов 9

Студворк — интернет-сервис помощи студентам
Всем привет, я уже замучился искать решение. На форуме видел похожие темы но ответы не помогали в решении задачи и проблемы. Сам язык pascal не очень знаю, поэтому туплю на каждой строчке. У самого такое вот задание: Type reals = file of real;
Описать процедуру p(f,g,h) от трех файлов типа reals, которая переписывает из файла f в непустой файл g все элементы, меньшие среднего арифметического всех элементов файла f, и в непустой файл h записывает все остальные числа.
Указание: введите файл f (последний элемент = 0). Выполните процедуру p(f,g,h). Распечатайте файлы g и h.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type
  reals = file of real;
  
procedure p(f,g,h : reals);
var
  n : Integer;
  s, r : Real;
begin
  while Not EOF(g) do Read(g, r);
  while Not EOF(h) do Read(h, r);
  n := 0; s := 0; while Not EOF(f) do begin Read(f, r); s := s + r; inc(n); end;
  if n = 0 then Exit;
  s := s / n; Seek(f, 0);
  while Not EOF(f) do begin Read(f, r); if r < s then Write(g, r) else Write(h, r); end;
end;
  
var
  f,g,h : reals;
  r : Real;
begin
  assign(f,'f.dat');assign(g,'g.dat');assign(h,'h.dat');
  Reset(f);Reset(g);Reset(h);
  p(f,g,h);
  Close(f);Close(g);Close(h);
  
  Write('f:'); Reset(f);while Not EOF(f) do begin Read(f, r); Write(r:8:2); end; Close(f); WriteLn;
  Write('g:'); Reset(g);while Not EOF(g) do begin Read(g, r); Write(r:8:2); end; Close(g); WriteLn;
  Write('h:'); Reset(h);while Not EOF(h) do begin Read(h, r); Write(r:8:2); end; Close(h); WriteLn;
end.
При выполнении кода выходит ошибка в 9 строке: Ошибка времени выполнения: Чтение после конца потока невозможно.
При работе программы также требуются три файла с расширением .dat в которых я записал произвольное число (12330,4456,9876).
Помогите решить и немного разобраться в коде!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2022, 11:25
Ответы с готовыми решениями:

Ошибка времени выполнения: Чтение после конца потока невозможно
Там где read(f,point); выдает ошибку &quot;Ошибка времени выполнения: Чтение после конца потока невозможно.&quot; В чем может быть проблема? ...

Ошибка времени выполнения: Чтение после конца потока невозможно
Ошибка в строке 9. var A: file of integer; B, I, J: integer; begin assign(A, 'D:\KEK.txt'); reset(A); while not...

Ошибка времени выполнения: Чтение после конца потока невозможно
Нужно найти элемент с минимальным количеством неуд. оценок по выбранному предмету и поменять с последним элементом тип. файла. Ошибка в 50...

9
Заблокирован
16.04.2022, 11:42
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
procedure p(var f,g,h : reals);
...
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
16.04.2022, 21:31
Old30School, зачем? file of T это класс, он и так по сссылке передаётся.

Добавлено через 9 минут
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
assign(f,'f.dat');
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
Reset(f);
Эти 2 вызова можно совместить:
Pascal
1
Reset(f, 'f.dat');
И на чтение вам надо открывать только первый файл. Остальные два, на сколько я понял, раз не пустые - значит на дописывание.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
type
  reals = file of real;
  
procedure p(f,g,h : reals);
begin
  var avg := f.ReadElements.Average;
  
  f.Position := 0;
  foreach var el in f.ReadElements do
    (if el<avg then g else h).Write(el);
  
end;
 
begin
  // var в наше время правильно ставить после begin
  var f,g,h: reals;
  Reset(f, 'f.dat');
  Append(g, 'g.dat');
  Append(h, 'h.dat');
  
  p(f,g,h);
  
  f.Position := 0;
  f.ReadElements.Println;
  
  g.Position := 0;
  g.ReadElements.Println;
  
  h.Position := 0;
  h.ReadElements.Println;
  
  f.Close;
  g.Close;
  h.Close;
end.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
17.04.2022, 06:49
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
При выполнении кода выходит ошибка в 9 строке: Ошибка времени выполнения: Чтение после конца потока невозможно.
При работе программы также требуются три файла с расширением .dat в которых я записал произвольное число (12330,4456,9876).
Как вы файл создаёте?
Мой хрустальный шар говорит, что тупо в редакторе текстом.
Так?

И что это за „произвольное число“, в котором два разделителя целой и дробной частей?
1
0 / 0 / 0
Регистрация: 07.03.2022
Сообщений: 3
18.04.2022, 05:13  [ТС]
Да файл просто в блокноте создал, просто набор цифр, и переименовал расширение в .dat

Добавлено через 8 минут
Спасибо за такое разъяснение, но при компиляции Вашего кода выходит ошибка: Program1.pas(18) : Нет перегруженной подпрограммы с такими типами параметров. На 18 строке Append(g, 'g.dat');
Может всё таки проблема в том что я как-то не правильно создаю файлы? Честно скажу сколько не читал пособие к этой задаче, так и не смог найти алгоритм создания не пустых файлов.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
18.04.2022, 05:36
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
Да файл просто в блокноте создал, просто набор цифр, и переименовал расширение в .dat
Ну так вы создали текстовый файл, в котором байты - это номера символов, как и внутри string.
А file of T это бинарный файл, хранящий данные так же как в оперативной памяти.

Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
Нет перегруженной подпрограммы с такими типами параметров. На 18 строке Append(g, 'g.dat');
А, кхм, и правда... Я, почему то вообще не вижу возможности переставить курсор в конец file of T.

Добавлено через 6 минут
Короче переделал под BlockFileOfT. Это оптимизированная алтернатива file of T которую я сам делал:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
uses BlockFileOfT;
 
type
  reals = BlockFileOf<real>;
  
procedure p(f,g,h : reals);
begin
  var avg := f.ToSeq.Average;
  
  foreach var el in f.ToSeq do
    (if el<avg then g else h).Write(el);
  
end;
 
begin
  var f := new reals('f.dat'); f.Reset;
  var g := new reals('g.dat'); g.Append;
  var h := new reals('h.dat'); h.Append;
  
  p(f,g,h);
  
  f.ToSeq.Println;
  g.ToSeq.Println;
  h.ToSeq.Println;
  
  f.Close;
  g.Close;
  h.Close;
end.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
18.04.2022, 05:47
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
Да файл просто в блокноте создал, просто набор цифр, и переименовал расширение в .dat
Ну, если бы было всё так просто.
Попробуйте открыть в блокноте файл картинки.
Увидите отличие просто набора цифр от бинарных файлов.

Sun Serega, прежде чем городить огород, разъяснить нужно ТС, про некорректность данных.
0
 Аватар для XzzzX
405 / 280 / 120
Регистрация: 09.07.2021
Сообщений: 1,016
Записей в блоге: 1
18.04.2022, 05:59
Цитата Сообщение от Sun Serega Посмотреть сообщение
Я, почему то вообще не вижу возможности переставить курсор в конец file of T.
Code
1
f.Position:= f.Size;
1
0 / 0 / 0
Регистрация: 07.03.2022
Сообщений: 3
18.04.2022, 07:37  [ТС]
Вообще очень много гуглил про эту задачу, но не находил работающего кода. Есть определенные условия type reals = file of real.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure P(var f,g,h:reals);
Var s,m:real;
Begin
    Reset(f);
    Rewrite(g);Rewrite(h);
    s:=0;
    While not Eof(f)do
    Begin
      read(f,m);
      s:=s+m;
    End;
    s:=s/FileSize(f);
    Reset(f);
    While not Eof(f) do
    Begin
      read(f,m);
      if m<s then write(g,m)
       else write(h,m);
    End.
В случае выполнения этого кода ошибка (20) : Встречено '.', а ожидалось ';'

Добавлено через 3 минуты
Ещё такой вариант нашёл, вроде из какой-то тем с форума:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
uses
crt;
type
  reals = file of real;
var
  f,g,h: reals;
  sre: real;
  key: char;
 
 
procedure clearfile(var ff: reals);
begin
Rewrite(ff);
close(ff);
end;
 
 
 
 
procedure p (var f1,g1,h1: reals; var sr: real);
 var
   a,a1: real;
   i:integer;
 begin
 a1:=0;
 i:=0;
  reset(f1);
while not eof(f1) do
  begin
  read(f1,a);
  inc(i);
  a1:=a1+a;
  end;
  sr:=a1/i;
  close(f1);
 
reset(f1);
reset(g1);
reset(h1);
while not eof(f1) do
begin
read(f1,a);
if a < sr then
   begin
   Seek(g1,FileSize(g1)); // Cтановимся в конец файла.
   Write(g1,a); // Записываем запись в файл }
   end
else
   begin
   Seek(h1,FileSize(h1));
   write(h1,a);
   end;
end;
 
close(f1);
close(g1);
close(h1);
end;
 
 
procedure vvodfile(var ff: reals; s: string);
var
  a: real;
begin
Rewrite(ff);
writeln('Введите числа в файл ',s,':');
repeat
  Read(a);
  write(ff,a);
until readkey = #27;
close(ff);
 
end;
 
procedure vyvodfile (var ff: reals; s: string);
var
  a:real;
begin
writeln();
writeln('Вывод содержимого файла ',s,' na ekran:');
writeln();
reset(ff);
while not eof(ff) do
  begin
  read(ff,a);
  write(a:0:2,'  ');
  end;
  close(ff);
  writeln();
end;
 
begin
 assign(f,'datF.dat');
 assign(g,'datG.dat');
 assign(h,'datH.dat');
  Writeln('Выберите режим работы программы.');
  Writeln('F1 - Ввод чисел в файл "datF.dat"');
  Writeln('F2 - Очистка файлов "datG.dat" и "datH.dat"');
  Writeln('F4 - Обработка содержимого ');
  Writeln('     файлов "datF.dat",,"datH.dat"');
  Writeln('F5 - Вывод содержимого "datF.dat","datG.dat","datH.dat"');
  Writeln('     без обработки.');
  repeat
  if keypressed then
    begin
     key:=readkey;
  case key of
  #59: begin
         vvodfile(f, 'datF.dat');
         vyvodfile (f,'datF.dat')
        end;
  #60: begin
         clearfile(g);
         clearfile(h);
         vyvodfile (g,'datG.dat');
         vyvodfile (h,'datH.dat');
        end;
 
  #62: begin
 
        p(f,g,h,sre);
        vyvodfile (f,'datF.dat');
        writeln('Среднее арифметическое всех чисел "datF.dat ": ',sre:0:2);
        vyvodfile (g,'datG.dat');
        vyvodfile (h,'datH.dat');
       end;
   #63: begin
        writeln();
        vyvodfile (f,'datF.dat');
        vyvodfile (g,'datG.dat');
        vyvodfile (h,'datH.dat');
       end;
      end;
  end;
 
 
  until key = #27;
 
end.
В данном коде программа не реагирует на нажатия клавиш F1-F6
Если знаете какую-то литературу или курс, или видео на ютубе которое может помочь, буду очень благодарен!
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
18.04.2022, 07:55
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
В случае выполнения этого кода
Компиляции. В случае компиляции синтаксически некорректной программы компилятор об этом честно и открыто говорит.
Цитата Сообщение от Kiwi_Engineer47 Посмотреть сообщение
очень много гуглил про эту задачу, но не находил работающего кода
У вас их в этой теме почти 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
24
25
26
27
28
29
30
31
32
33
34
type Reals = file of Real;
 
procedure p(var f, g, h: Reals);
var s, t: Real;
begin
  Seek(f,0); s:=0;
  while not EoF(f) do begin
    Read(f,t); s:=s+t;
  end;
  s:=s/FileSize(f); Seek(f,0); Seek(g,FileSize(g)); Seek(h,FileSize(h));
  while not EoF(f) do begin
    Read(f,t); if t<s then Write(g,t) else Write(h,t);
  end;
end;
 
procedure w(var f: Reals; const p: String);
var t: Real;
begin
  Seek(f,0); WriteLn(p);
  while not EoF(f) do begin
    Read(f,t); Write(' ',t);
  end; WriteLn;
end;
 
var
  f, g, h: Reals;
  r: Real;
begin
  Assign(f,'f.dat'); Reset(f);
  Assign(g,'g.dat'); Reset(g);
  Assign(h,'h.dat'); Reset(h);
  p(f,g,h); w(f,'F:'); w(g,'G:'); w(h,'H:');
  Close(f); Close(g); Close(h);
end.
Добавлено через 8 минут
Если при отсутствии файлов g, h не нужно падать по ошибке, то дописать соответствующий код к открытию файла.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.04.2022, 07:55
Помогаю со студенческими работами здесь

Подпрограмма выдает ошибку времени выполнения: Чтение после конца потока невозможно
Дан файл, содержащий сведения об игрушках: указывается название игрушки, ее стоимость в рублях и возрастные границы (например, игрушка...

Ошибка времени выполнения: System.IO.EndOfStreamException: Чтение после конца потока невозможно
type TLine = record line: string; //строка key: byte; //выделение строки (для второго задания) worb: string; //слово...

Прочитать матрицу из файла но видает ошибку времени выполнения: Чтение после конца потока
Прочитать матрицу М (10, 12) из ​​файла F1. Переставить строки этого массива так, чтобы сумма элементов каждой строки росла от первой до...

Ошибка при чтении файла: Чтение после конца потока невозможно
Всем добрый вечер! Пытаюсь считать данные из rtf файла и загрузить их в excel файл. Но выпадает exception: Чтение после конца потока...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать обычную программу для расчета некоторых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru