Помощь - Поиск - Пользователи - Календарь
Полная версия: типированный файл
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.