Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Непонял юмор BlockWrite & BlockRead


Автор: devmstr 4.10.2004, 19:20
Почему данный код записывает файл размером в 7 байт:
Type
TA = array of string;
Var
it:integer;
f:file;
A:^TA;
begin
New(A);
SetLength(A^,7);
A^[0]:='Понедельник';
A^[1]:='Вторник';
A^[2]:='Среда';
A^[3]:='Четверг';
A^[4]:='Пятница';
A^[5]:='Суббота';
A^[6]:='Воскресенья';

AssignFile(f,GetCurrentDir+'\1.tmp');
Rewrite(f,1);
BlockWrite(F,A,7);
CloseFile(F);
end;
Читаю(Выводит то что и должно):
Type
TA = array of string;
Var
it:integer;
f:file;
A:^TA;
begin

New(A);
SetLength(A^,7);
for it:=0 to 6 do
A^[it]:='';

AssignFile(f,GetCurrentDir+'\1.t');
Reset(f,1);
BlockRead(F,A,7);
ShowMessage(a^[0]);
CloseFile(F);
end;


!!!!!!!!А данный код записывает файл размером в 28 байт:
Type
TA = array[0..6] of string;
Var
it:integer;
f:file;
A:TA;
s:string;
begin
A[0]:='Понедельник';
A[1]:='Вторник';
A[2]:='Среда';
A[3]:='Четверг';
A[4]:='Пятница';
A[5]:='Суббота';
A[6]:='Воскресенья';

AssignFile(f,GetCurrentDir+'\1.t');
Rewrite(f,1);
BlockWrite(F,A,sizeof(A));
ShowMessage(inttostr(sizeof(A)));

CloseFile(F);
end;

Читается тоже все корректно:
Type
TA = array[0..6] of string;
Var
it:integer;
f:file;
A:TA;
begin
A[0]:='';
A[1]:='';
A[2]:='';
A[3]:='';
A[4]:='';
A[5]:='';
A[6]:='';

AssignFile(f,GetCurrentDir+'\1.t');
Reset(f,1);

BlockRead(F,A,sizeof(A));
ShowMessage(a[0]);
CloseFile(F);

end;

Объясните причину пожайлуста!

Автор: Ibragim 4.10.2004, 19:58
Обе пары функций работают некорректно. Чтобы убедиться в этом, достаточно вызвать чтение из файла не сразу после записи, а закрыв/перекомпилировав программу.
В первый раз ты насильно ставишь BlockWrite(F,A,7); длину 7 - вот семь байт и пишется. Причем это адреса smile.gif
Во второй раз пишешь реальную длину А (указатель 4 байта, семь указателей). Но в файл все равно пишутся адреса.

А видимость правильного чтения получаешь, потому что содержимое строк ("понедельник") не делетиться физически из памяти по A[0] := '' , а A присваивается адрес nil. Естественно в следующий раз при присвоении того же адреса (в том же сеансе программы) ты находишь там информацию "понедельник"

Автор: devmstr 4.10.2004, 21:19
Извиняюсь за вопрос - протупил.
Весь первый пример - глупость.
Во первых Нужно Dispose(A);
Во вторых BlockRead(F,A^,Sizeof(A^)*7);
И самое главное данный пример АБСОЛЮТНО не подходит для строк не фиксированной длины.
ЕЩЕ РАз прошу ИЗВИНЕНИЯ.
СЧИТАЮ ТЕМУ ЗАКРЫТОЙ! wink.gif

Отдельное спасибо Ibragim за уделенное внимание!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)