![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная штука с записью и чтением в и из файла [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]ой. не смотрите, на то, что в коментарии