Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2015, 07:46   #1
mefisto74
 
Регистрация: 28.09.2015
Сообщений: 7
По умолчанию Запись в конец типизированного файла

Здравствуйте. я пытаюсь записать в конец типизированного файла (real) некоторые значения, а мне вываливается EinOutError: read past end of file
даже если делать так:
Код:
seek(f,FileSize(f);
write(f,500);
то вываливается эта ошика
помогите

Последний раз редактировалось Stilet; 28.09.2015 в 08:33.
mefisto74 вне форума Ответить с цитированием
Старый 28.09.2015, 08:32   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

исходник покажь.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.09.2015, 08:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Полностью код показать можешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2015, 08:56   #4
mefisto74
 
Регистрация: 28.09.2015
Сообщений: 7
По умолчанию

ну исходник это много поэтому я решил ограничиться двумя строками чтоbы поняли о чем я) ну вот вам полная версия, нужное в процедуре Fnegativetemp



Код:
program project1;

{$mode objfpc}{$H+}

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };

{ TMyApplication }

type
RealFile=file of real;

{ TMyApplication }
procedure vvodN(var Fx:RealFile);
var
a:real;
i:integer;
begin
assign(Fx,'temp.dat');
rewrite(Fx);
writeln('enter 10 real numbers');
for i:=1 to 10 do
begin
readln(a);
write(Fx,a);
end;
write('numbers recorded');
close(Fx);
end;

procedure vvodM(var Fx:RealFile); {random numbers}
var
a:real;
i:integer;
begin
assign(Fx,'temp.dat');
reset(Fx);
Seek(Fx, FileSize(Fx));
randomize;
for i:=1 to 10 do
begin
a:=random(100);
write(Fx,a);
end;
writeln;
write('random numbers recorded');
close(Fx);
end;

procedure PositiveNumbers(var Fx:RealFile);
var
temp_p:RealFile;
Positive:real;
begin
assign(temp_p,'temp_p.dat');
rewrite(temp_p);
assign(Fx,'temp.dat');
reset(Fx);
while not eof(Fx) do
begin
read(Fx,Positive);
if Positive>0 then
write(temp_p,Positive);
end;
Writeln;
writeln('positive numbers recorded');
close(Fx);
close(temp_p);
end;

procedure decade(var Fx:RealFile); {not working}
var
DecadeTemp:real;
n:integer;
begin
write('decade temp= ');
assign(Fx,'temp.dat');
reset(Fx);
n:=0;
seek(fx,0);
while not eof(Fx) do
begin
if FilePos(Fx)<FileSize(Fx) then begin
seek(Fx, filepos(Fx)+9);
read(Fx,DecadeTemp);
write(DecadeTemp:0:2);
write(' ');
end;
end;
close(Fx);
end;

procedure FnegativeTemp(var Fx:RealFile);
var
i:integer;
Ntemp:real;
NArray:array[1..20] of real;
begin
assign(Fx,'temp.dat');
reset(Fx);

for i:=1 to FileSize(Fx) do begin
read(Fx,Ntemp);
seek(fx,FileSize(Fx));

if Ntemp<0 then begin
Narray[i]:=Ntemp;
write(Fx,Narray[i]);
seek(Fx,i);
end;

end;
  close(Fx);
end;




procedure outputAll(var Fx:RealFile);
var
alltemp:real;
begin
assign(Fx,'temp.dat');
reset(Fx);
Writeln;
writeln('all file: ');
seek(Fx,0);
while not eof(Fx) do begin
read(Fx,alltemp);
write(alltemp:0:2);
write(' ');
end;
close(Fx);
end;

var
Fx:RealFile;
begin
vvodN(Fx);
vvodM(Fx);
PositiveNumbers(Fx);

FnegativeTemp(Fx);
decade(Fx);
outputAll(Fx);

readln;
end.
mefisto74 вне форума Ответить с цитированием
Старый 28.09.2015, 09:04   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Всё верно, так и быть должно.
Цитата:
Код:
for i:=1 to FileSize(Fx) do begin
read(Fx,Ntemp); // <--- fucking EinOutError: read past end of file
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.09.2015, 09:25   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
for i:=1 to FileSize(Fx) do begin
read(Fx,Ntemp);
mefisto74, а зачем тут цикл? Тебе нужно одно значение считать или несколько?
И почему не while с проверкой на eof()?
И почему кстати не использовать TFileSream раз уж у тебя Лазарус?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2015, 13:33   #7
mefisto74
 
Регистрация: 28.09.2015
Сообщений: 7
По умолчанию

min@y™: ии?) я догадываюсь что оно через for цикл само не перебирает, ну хорошо я разбил на два цикла

Код:
procedure FnegativeTemp(var Fx:RealFile);
var
k,i:integer;
Ntemp:real;
NArray:array[1..20] of real;
begin
assign(Fx,'temp.dat');
reset(Fx);
 k:=0;
while not eof(Fx) do begin
k:=k+1;
read(Fx,Ntemp);
if Ntemp<0 then begin
Narray[k]:=Ntemp;
end;
end;

seek(fx,FileSize(Fx));

for i:=1 to 20 do begin
if Narray[i]<0 then
write(Fx,Narray[i]);
end;
close(Fx);
end;
что тут тогда не так? та же ошибка


Stilet: Мне нужна из файла отрицательные значения скопировать в конец файла
я уже даже через массив делаю, пытаюсь просто в массив запихнуть, а потом этот массив вставить в конец, но нет.

вариант 2 -
Код:
procedure FnegativeTemp(var Fx:RealFile);
var
k,i,Fileposi:integer;
Ntemp:real;
NArray:array[1..20] of real;
begin
assign(Fx,'temp.dat');
reset(Fx);
 k:=0;
while not eof(Fx) do begin
Fileposi:=FilePos(Fx);
read(Fx,Ntemp);
if Ntemp<0 then begin
seek(fx,FileSize(fx));
write(Fx,Ntemp);
Seek(Fx,Fileposi);
end;
end;
тогда не показывает вообще ничего
короче направьте меня в какую сторону правильно делать если ни одно из моих решений не подходит ^^

p.s TFileSteam во-первых не знаю что это, а во-вторых мне поидее нужно делать в Delphi, но я в среде linux и поэтому делаю в лазарус
mefisto74 вне форума Ответить с цитированием
Старый 28.09.2015, 13:34   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну тебе позволено использовать TFileStream?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2015, 13:42   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Как звучит задание в оригинале?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.09.2015, 14:10   #10
mefisto74
 
Регистрация: 28.09.2015
Сообщений: 7
По умолчанию

min@y™: да вроде я ясно написал в чем задача, ну ладно

"Скопировать в конец файла «temp.dat» отрицательные температуры, хранящиеся в нем."

Stilet если его нет в делфи то нет :D
ну и т.к мы его не проходили и вряд ли будем то скорее нет чем да

Последний раз редактировалось mefisto74; 28.09.2015 в 14:14.
mefisto74 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считать запись из типизированного файла в динамическую очередь ( Delphi ) SeregaVili Помощь студентам 10 22.05.2013 11:20
Запись и чтение типизированного файла (Паскаль). Учёт заказов мебели Jlovenpk1 Помощь студентам 1 29.11.2012 09:30
Запись типизированного файла из текстового. Lubawa Паскаль, Turbo Pascal, PascalABC.NET 18 05.11.2011 11:27
Запись структуры в конец файла Ozerich Общие вопросы C/C++ 0 03.05.2010 23:10
запись в конец файла kate158 Общие вопросы Delphi 2 28.09.2009 19:17