Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ ФАЙЛЫ

Автор: Танкистка 21.12.2006 3:49

Я неочень хорошо поняла тему Файлы.... вообщем вотЪ такая вотЪ задачка... я там чет пыталась написать. Вообщем там наверно много неочень разумного...жду ЛЮБЫХ советов и поправок... Пасибки, кто поможет)

Заполнить файл последовательного доступа f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле q те компоненты файла f, которые являются четными.


const n=30;
Var f,q:text;
a:array[1..n] of integer;
i:integer;
Begin
randomize;
for i:=1 to n do
a[i]:=random(100);
Assign(f,'e:\celie.txt');
rewrite(f);
for i:=1 to n do
writeln(f,a[i]);
close(f);
reset(f);
assign(q,'e:\chetnie.txt');
rewrite(q);
while Not(Eof(f)) do
if a[i] mod 2=0 then writeln(q,a[i]);
close(f);
close(q);
Writeln('vot tak','e:\celie.txt','e:\chetnie.txt');
readln;
end.

Автор: Bokul 21.12.2006 3:52

А тебе можно работать с типизированными файлами?

Автор: мисс_граффити 21.12.2006 4:35

файл последовательного доступа - это текстовый?

Автор: Lapp 21.12.2006 7:34

Файл последовательного доступа - это практически любой файл. Это понятие относится к организации доступа к устройству, а не к наполнению.

У тебя была ошибка в цикле записи файла четных чисел. Ты не читала файл целых, а писала четные прямо из старого массива (кстати, зачем тебе вообще массив?.. убери его). При этом заканчивала цикл по концу файла, который никогда не заканчивался, раз ты его не читала..
Исправленный вариант:

const
n=30;
Var
f,q:text;
a:array[1..n] of integer;
i:integer;

Begin
randomize;
for i:=1 to n do a[i]:=random(100);
Assign(f,'e:\celie.txt');
rewrite(f);
for i:=1 to n do writeln(f,a[i]);
close(f);
reset(f);
assign(q,'e:\chetnie.txt');
rewrite(q);
while Not(Eof(f)) do begin
ReadLn(f,i);
if not Odd(i) then writeln(q,i)
end;
close(f);
close(q);
Writeln('vot tak: ',' e:\celie.txt ',' e:\chetnie.txt ');
readln;
end.

PS
не забывай про пробелы при выводе результатов smile.gif

Автор: volvo 21.12.2006 15:16

Цитата
Файл последовательного доступа - это практически любой файл.
Грубейшая ошибка!!!

Файл последовательного доступа - ТОЛЬКО текстовый, и никакой другой, ибо только к текстовому файлу неприменим Seek, и для того, чтобы обратиться к символу с №120, надо прочесть все 119, которые идут перед ним... Все остальные (типизированные/бестиповые) файлы имеют фиксированный размер компонента, и позволяют обращаться к любому компоненту напрямую...

P.S. Очень жаль, что приходится перепечатывать FAQ ( http://forum.pascal.net.ru/index.php?showtopic=3584 -> "Последовательный и примой доступ" ), да еще и в ответ на заявление админа форума dry.gif

Автор: мисс_граффити 21.12.2006 15:51

volvo,Lapp, не ссорьтесь...
я почему уточнила...
совсем недавно делала лабу - многофазную сортировку слиянием. она вообще-то расчитана на ленты - то есть штуки только с последовательным доступом. сортировались числа, поэтому, чтобы не делать лишний перевод, использовался file of integer. но - никаких seek (это противоречило бы классическому алгоритму).
вот и тут вопрос - то ли речь о том, какой должен быть файл, то ли о том, как с ним работать...
просто формулировка "заполнить файл целыми числами" не совсем точная - если речь именно о текстовом.

Автор: Lapp 21.12.2006 16:03

Цитата(мисс_граффити @ 21.12.2006 12:51) *

volvo,Lapp, не ссорьтесь...

А кто ссорится? smile.gif
volvo, спасибо за напоминание теории - ошибку понял, исправлюсь smile.gif. В следующий раз буду осторожнее в ответах.. Действительно ведь, чушь спорол sad.gif
Танкистка, извини тоже..

Автор: Танкистка 21.12.2006 16:24

Lapp , пасибки... большие.... smile.gif Ты мне как всегда помог))))) wink.gif
volvo и тебе пасиба!!!!! yes2.gif