Помощь - Поиск - Пользователи - Календарь
Полная версия: Типизированный файл с прямым доступом
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
xproo100x
Ребята, очень нужна помощь, искал на сайте не нашёл, киньте ссылку если тема уже была создана ранее или помогите тут!
Суть такова...существует файл(типизированный) в определённом куске программы его нужно вывести на экран, точнее одну запись, вопрос - как организовать прямой доступ к этому файлу?
заранее благодарен!
volvo
Цитата
вопрос - как организовать прямой доступ к этому файлу?
Ответ: Открыть файл Reset-ом и переместиться к нужной компоненте через Seek. Ключевые слова у тебя уже есть, теперь можно идти в поиск, уж о чем-о чем, а о файлах тем было немерено. Ищи и пробуй. Что не получится - спрашивай...
xproo100x
Цитата(volvo @ 7.06.2010 20:02) *

Ответ: Открыть файл Reset-ом и переместиться к нужной компоненте через Seek.


то что seek это понятно...откуда мне узнать на какой из компанет нужная информация находится?
в общих чертах:
выводится на экран информация о магазинах, а фамилия директора берётся из справочного файла(типизированный файл с прямым доступом)
в эту процедуру поиска фамиилии забирается код магазина и вот по этому коду нужно найти фамилию.

Или мне нужно создать цикл где seek(...,i) и он рано или поздно придёт на нужное...так?

Добавлено через 13 мин.
Function FindFIO(a:integer):string;
var x: ...;(тот же тип что и file)
begin
reset(file)
read(file,x)
for i:=0 to filesize(file) do
begin
seek(file,i);
if x.kod=a then FindFIO:=x.fio {kod - код магазина, fio ФИО директора}
end;
end;


так чтоли?



М
Тэги!!
Lapp

Client
ну раз надо найти, то придется по очереди перебирать, пока не найдешь. Лучше просто read, без seek
Lapp
Цитата(xproo100x @ 7.06.2010 20:20) *
то что seek это понятно...откуда мне узнать на какой из компанет нужная информация находится?
Искусство подменять первоначальный вопрос совсем другим.. norespect.gif На твой вопрос тебе был дан точный и исчерпывающий ответ.

Цитата(xproo100x @ 7.06.2010 20:20) *
так чтоли?
А где у тебя чтение? Оператор seek ничего не читает, он только позиционирут указатель на запись с данным номером. И, как уже сказал Client, если поиск идет подряд, то незачем использовать seek.

function FindFIO(code: integer): string;
var
x: tx;
f: file of tx;
begin
FindFIO:='';
Assign(f,'db.dat');
Reset(f);
while not EoF do begin
Read(f,x);
with x do if kod=code then begin
FindFIO:=FIO;
break
end
end;
Close(f)
end;


Если бы твой файл был упорядочен по кодам, то можно было бы применить дихотомию. Вот тогда seek бы сыграл.

P.S.
И не надо использовать зарезервированные слова (file) для названия переменных..
xproo100x
Цитата(Client @ 7.06.2010 23:12) *

ну раз надо найти, то придется по очереди перебирать, пока не найдешь. Лучше просто read, без seek


просто перебирать это последовательный!а мне нужен прямой...как то через seek...

Добавлено через 8 мин.
Цитата(Lapp @ 8.06.2010 1:15) *


1.Если бы твой файл был упорядочен по кодам, то можно было бы применить дихотомию. Вот тогда seek бы сыграл.

2.P.S.
И не надо использовать зарезервированные слова (file) для названия переменных..


1.Сортировка есть в отдельной процедуре вот код...проблема в том как потом в функции это всё дело находить через seek, очень прошу помочь!


{$R-}
procedure sort;
type
list=array[1..1] of tplus;
MyList=^list;
var i,j,n: integer;
buf: tplus;
fplus: file of tplus;
mas: MyList;
ind: boolean;
begin
assign(fplus,'DOP.DAT');
reset(fplus);
n:=filesize(fplus);
getmem(mas,(n+1)*sizeof(TPlus));
i:=1;
while not eof(fplus) do
begin
read(fplus,mas^[i]);
inc(i);
end;
repeat
ind:=true;
for i:=1 to n-1 do
if mas^[i].kod>mas^[i+1].kod then
begin
buf:=mas^[i];
mas^[i]:=mas^[i+1];
mas^[i+1]:=buf;
ind:=false;
end;
until ind;
close(fplus);
rewrite(fplus);
for i:=1 to n do begin write(fplus,mas^[i]);

end;
close(fplus);
reset(fplus);
freemem(mas,(n+1)*sizeof(TPlus));
end;
{$R+}




2.Учёл, больше не буду
Client
Цитата
просто перебирать это последовательный!а мне нужен прямой...как то через seek...
Что такое файл с последовательным дотупом знаешь? А с прямым доступом? Как сделать уже сказали, а ты опять за свое
Lapp
Цитата(xproo100x @ 8.06.2010 13:11) *
просто перебирать это последовательный!а мне нужен прямой...как то через seek...
А, так вот, в чем дело.. )) Ты запутался в терминологии..

Есть такие два понятия: "файл прямого доступа" и "файл последовательного доступа".
Типизированный файл относится к первому типу. Файл типа Text, например - ко второму.
А дальше - хоть как их используй, свой тип они не поменяют..
Если ты перебираешь, например, элементы массива подряд (тоже ищешь нужный) - что, он у тебя теперь "массив последовательного доступа"? smile.gif

seek нужно применять там, где нужно. Что, файл прямого доступа теперь уже нельзя подряд читать? smile.gif))) Или для чтения следующей записи нужно обязательно использовать seek????

Короче, наведи порядок с терминами в своей голове сначала.

и еще, что ты хотел сказать этим:
Цитата
1.Сортировка есть в отдельной процедуре вот код...
Меня не интересует, в какой она процедуре и какой там код. Меня вообще не интересует, был ли файл отсортирован, или, может, создан уже в таком порядке. Меня интересует только результат: расположены ли его записи в порядке возрастания (убывания) поля Код. Все. Если ты говоришь "да" - я (или кто-то еще тут) тебе показываю, как использовать seek для быстрого поиска.

Давай, разбирайся
volvo
Цитата
Сортировка есть в отдельной процедуре вот код
Срочно читай вот это:
Как не надо писать программы (пункт 2) и исправляй программу. Иначе будешь грести ошибки. smile.gif
xproo100x
Цитата(volvo @ 9.06.2010 0:33) *

Срочно читай вот это:
Как не надо писать программы (пункт 2) и исправляй программу. Иначе будешь грести ошибки. smile.gif


программа нормально работает, всё сортирует))а где ошибка то?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.