Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

Странная штука с записью и чтением в и из файла   Найти похожие ветки 

 
Blind Guardian   (2007-10-14 17:34) [0]

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

{$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.

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


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

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


 
Desdechado ©   (2007-10-14 19:15) [2]

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


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

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


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

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

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


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

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


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


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

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


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


> Blind Guardian   (14.10.07 17:34)

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



Страницы: 1 вся ветка

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
2-1192002526
alshtam
2007-10-10 11:48
2007.11.04
выбор базы данных


4-1177745646
AlexPH
2007-04-28 11:34
2007.11.04
Как получить доступ к удаленному реестру


15-1191393493
Lex_!
2007-10-03 10:38
2007.11.04
Использование .NET 3.x


11-1175550542
nsvi
2007-04-03 01:49
2007.11.04
Не могу найти пакет KOLNTprivileges, про который пишет в своей кн


15-1191262340
cber
2007-10-01 22:12
2007.11.04
В чём ошибка?