Помощь - Поиск - Пользователи - Календарь
Полная версия: типированный файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
hellspawn
помогите плиз откомпилировать прогу! я торможу, а завтра сдавать...мне fpc выдает ошибки на немовпадение типов данных в процах blockread и blockwrite. по сути последняя переменная в скобках должна быть типа word, но у меня работа со строками, и я не знаю что делать... sad.gif

uses crt;

const
delimiters=[' ','.',',',';','!','?',':','*','#','$','(',')','[',']'];

type
TDirections=(ReadFile,WriteFile);
ArrString=array [1..10] of string;
ArrBuf=array [1..1024] of byte;

function OpenNonTypicalFile (buf: ArrBuf; var F: file; FileName: string; Direction: TDirections): boolean;
var Result: boolean;
begin
assign(F,FileName);
Result:=True;
case Direction of
ReadFile: Reset(F,sizeof(F));
WriteFile: ReWrite(F,sizeof(F));
end;
if IOResult<>0 then
begin
case Direction of
ReadFile: writeln('Failed to read file '+FileName);
WriteFile: writeln('Failed to write file '+FileName);
end;
Result:=False;
end;
OpenNonTypicalFile:=Result;
end;

function ReadNonTypicalFile (buf: ArrBuf; var F: file; d: string): string;
begin
while not eof(F) do
begin
BlockRead(F,buf,sizeof(d),d);
end;
ReadNonTypicalFile:=d;
end;

function FirstIndex (s: string; var i: byte): byte;
begin
while (s[i] in delimiters) do
inc(i);
FirstIndex:=i;
end;

function LastIndex (s: string; i: byte): byte;
begin
while not(s[i] in delimiters) do
inc(i);
LastIndex:=i-1;
end;

function GetWord (s: string; b,e: byte): string;
begin
GetWord:=copy(s,b,e-b+1);
end;

var
i, j, s, FI, LI, l, wordbeg, iel: byte;
line, el: string;
a: ArrString;
buf: ArrBuf;
F: file;

begin
clrscr;

if OpenNonTypicalFile(buf,F,'111.dat',ReadFile) then
line:=ReadNonTypicalFile(buf,F,el);


wordbeg:=1;
i:=1;
s:=0;
begin
l:=length(line);
while wordbeg<l+1 do
begin
FI:=FirstIndex(line,wordbeg);
LI:=LastIndex(line,FI);
writeln(GetWord(line,FI,LI));
a[i]:=GetWord(line,FI,LI);
inc(i);
s:=s+1;
wordbeg:=LI+1;
end;
end;


if OpenNonTypicalFile(buf,F,'112.dat',WriteFile) then
for i:=1 to s do
begin
el:=a[i];
iel:=i;
for j:=1 to s do
if (a[j]=el) and (not(j=iel)) then
a[j]:='';
end;


for i:=1 to s do
BlockWrite(F,buf,sizeof(a[i]),a[i]);

close(F);

end.

volvo
А что ты хочешь делать в этих самых BlockRead/BlockWrite? Задумка у тебя какая? Читать в arrBuf, или в строку? Зачем в функцию передается строка - непонятно... Само задание приведи...
hellspawn
Цитата(volvo @ 21.12.2008 18:15) *

А что ты хочешь делать в этих самых BlockRead/BlockWrite? Задумка у тебя какая? Читать в arrBuf, или в строку? Зачем в функцию передается строка - непонятно... Само задание приведи...

нужно удалить из строки повторяющиеся слова, притом чтение строки должно происходить из файла, и запись результата тоже в файл. я сперва выделяю слово, затем я записываю слова в массив строк и удаляю повторы.
volvo
Смотри, если ты делаешь это на FPC, то читать всю строку из файла можно так:

function ReadNonTypicalFile(var F: file): string;
var
buf: ArrBuf;
wasread: word;
begin
BlockRead(F, buf, sizeof(buf), wasread);
move(buf, ReadNonTypicalFile[1], wasread);
end;

, тогда процесс чтения/записи будет выглядеть:
begin
clrscr;
if OpenNonTypicalFile(buf,F,'111.dat',ReadFile) then begin
line:=ReadNonTypicalFile(F);
close(F); // закрываем файл ...
end;

// ...
// тут - сам процесс обработки строки ... Вот с ним у тебя проблема,
// что-то некорректно делается, проверь ...


// И после обработки - открытие файла для записи:
// Зачем передаешь buf - непонятно, лучше убери...
if OpenNonTypicalFile(buf, F, '112.dat', WriteFile) then { ... удаление дубликатов }

for i:=1 to s do
blockwrite(f, a[i][1], length(a[i]));

close(F);
end.
hellspawn
спасибо огромное, выручил smile.gif только вот не оч понятно что такое move...
volvo
Цитата
не оч понятно что такое move...
move - это стандартная Паскалевская процедура, предназначенная для пересылки данных. Первый параметр - источник, второй - приемник, третий - размер в байтах...

Кстати, совсем забыл... Чтобы то, что я написал, работало корректно, нужно
case Direction of
ReadFile: Reset(F, 1); // Открывать файл с длиной блока данных = 1 байту, иначе будут проблемы
WriteFile: ReWrite(F, 1);
end;
hellspawn
спасибо, просветил smile.gif и еще раз спасибо!! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.