| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 - вот семь байт и пишется. Причем это адреса Во второй раз пишешь реальную длину А (указатель 4 байта, семь указателей). Но в файл все равно пишутся адреса. А видимость правильного чтения получаешь, потому что содержимое строк ("понедельник") не делетиться физически из памяти по A[0] := '' , а A присваивается адрес nil. Естественно в следующий раз при присвоении того же адреса (в том же сеансе программы) ты находишь там информацию "понедельник" |
| Автор: devmstr 4.10.2004, 21:19 |
| Извиняюсь за вопрос - протупил. Весь первый пример - глупость. Во первых Нужно Dispose(A); Во вторых BlockRead(F,A^,Sizeof(A^)*7); И самое главное данный пример АБСОЛЮТНО не подходит для строк не фиксированной длины. ЕЩЕ РАз прошу ИЗВИНЕНИЯ. СЧИТАЮ ТЕМУ ЗАКРЫТОЙ! Отдельное спасибо Ibragim за уделенное внимание! |