Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонял юмор BlockWrite & BlockRead 
:(
    Опции темы
devmstr
  Дата 4.10.2004, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: 2
Всего: 11



Почему данный код записывает файл размером в 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;

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


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Ibragim
Дата 4.10.2004, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



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

А видимость правильного чтения получаешь, потому что содержимое строк ("понедельник") не делетиться физически из памяти по A[0] := '' , а A присваивается адрес nil. Естественно в следующий раз при присвоении того же адреса (в том же сеансе программы) ты находишь там информацию "понедельник"
PM MAIL   Вверх
devmstr
Дата 4.10.2004, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: 2
Всего: 11



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

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



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.