![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| devmstr |
|
|||
![]() 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 ![]() |
|||
|
||||
| Ibragim |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 28.9.2004 Где: Киев Репутация: нет Всего: нет |
Обе пары функций работают некорректно. Чтобы убедиться в этом, достаточно вызвать чтение из файла не сразу после записи, а закрыв/перекомпилировав программу.
В первый раз ты насильно ставишь BlockWrite(F,A,7); длину 7 - вот семь байт и пишется. Причем это адреса Во второй раз пишешь реальную длину А (указатель 4 байта, семь указателей). Но в файл все равно пишутся адреса. А видимость правильного чтения получаешь, потому что содержимое строк ("понедельник") не делетиться физически из памяти по A[0] := '' , а A присваивается адрес nil. Естественно в следующий раз при присвоении того же адреса (в том же сеансе программы) ты находишь там информацию "понедельник" |
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: 2 Всего: 11 |
Извиняюсь за вопрос - протупил.
Весь первый пример - глупость. Во первых Нужно Dispose(A); Во вторых BlockRead(F,A^,Sizeof(A^)*7); И самое главное данный пример АБСОЛЮТНО не подходит для строк не фиксированной длины. ЕЩЕ РАз прошу ИЗВИНЕНИЯ. СЧИТАЮ ТЕМУ ЗАКРЫТОЙ! Отдельное спасибо Ibragim за уделенное внимание! -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |