Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странная штука с записью и чтением в и из файла [D7, WinXP]


Blind Guardian ©   (2007-10-14 17:34:00) 

Здравствуйте. Столкнулся с непонятным мне явлением. Написал небольшой код, в котором хорошо отражается проблема:

{$APPTYPE CONSOLE}
{$o-}

const
 filename='text.txt';
 len=26;

type
 ptext=^text;
 Tstruct=array [0..len-1] of integer;

const
 sz=sizeof(Tstruct);

procedure readFromFile(addr:pbyte;size:integer;pf:ptext);
var
 i1:integer;
 c:char;
begin
 for i1:=0 to size-1 do begin
   read(pf^,c);
   addr^:=ord(c);
   inc(addr);
 end;
end;

procedure writeToFile(addr:pbyte;size:integer;pf:ptext);
var
 i1:integer;
begin
 for i1:=0 to size-1 do begin
   write(pf^,chr(addr^));
   inc(addr);
 end;
end;

var
 i1:integer;
 ar:Tstruct;
 f1:text;

begin
 for i1:=0 to high(ar) do
   ar[i1]:=i1;           //заполняем массив
 assign(f1,filename);
 rewrite(f1);
 {}writeToFile(@ar,sz,@f1);
 {for i1:=0 to high(ar) do
   writeToFile(@ar[i1],8,@f1);}
 close(f1);
 fillchar(ar,sz,0);//изменяем массив (в данном случе, заполняя его нулями)
 assign(f1,filename);
 reset(f1);
 {}readFromFile(@ar,sz,@f1);
 {for i1:=0 to high(ar) do
   readFromFile(@ar[i1],8,@f1);}
 close(f1);[Small][/Small]
 for i1:=0 to high(ar) do
   writeln(ar[i1]);      //выводим массив
 readln;
end.


Суть такова: записать данные (в данном случае - array [0..len-1] of integer) в файл, а потом прочесть информацию из файла.

Для записи информации из оперативной памяти в файл я создал writeToFile, для чтения файла в память - readFromFile. И там, и там: Addr - адрес в памяти, size - к-во байт для чтения или записи, pf - указатель на открытый файл.

Запустите эту программу. Всё работает, как надо. Но измените значение константы len на 27 и тогда запустите. То же самое повторяется при всех значениях len больше 26.

В чем дело? Как заставить работать программу нормально?


Германн   (2007-10-15 02:18:00) [1]


> Blind Guardian   (14.10.07 17:34)

Вот это прочитай http://www.delphikingdom.com/lyceum/seminar.asp?ID=2
Полезно.


Германн   (2007-10-15 01:05:00) [2]


> так. а как мне записать определенный байт в файл, кроме
> как write(f,chr(any_number))?

Тип файловой переменной измени.  Процедурами Read и Write  не единственные. Есть и их аналоги для других типов файлов. Кстати даже более оптимальные.


Плохиш   (2007-10-15 01:03:00) [3]

TFileStream
BlockWrite/BlockRead, читать описание работы с файлами...


Blind Guardian   (2007-10-15 00:49:00) [4]

Desdechado ©   (14.10.07 19:15) [2]
так. а как мне записать определенный байт в файл, кроме как write(f,chr(any_number))?

Однокамушкин   (14.10.07 19:40) [3]
тогда как действовать, если этот байт попадается спонтанно?


Однокамушкин   (2007-10-14 19:40:00) [5]

Символ #26 является признаком конца текстового файла, всё, что идёт после него, игнорируется


Desdechado   (2007-10-14 19:15:00) [6]

Скажи, зачем ты работаешь текстовыми методами с нетекстовыми данными?


Blind Guardian   (2007-10-14 17:44:00) [7]

ой. не смотрите, на то, что в коментарии


Наверх

Титульная страница Поиск, карта сайта Написать письмо