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

Вниз

Неясности в формате файла   Найти похожие ветки 

 
Юрий Зотов ©   (2010-07-12 21:31) [120]


> Виталий ©   (12.07.10 21:29) [118]

Да не можно, а НУЖНО. Еще час назад надо было это сделать.


 
Виталий ©   (2010-07-12 21:33) [121]

Жесть. Не знаю, в MMF я полез или нет, я просто говорю о том, что нашел в книге об отображаемых в память файлах.


 
Юрий Зотов ©   (2010-07-12 21:35) [122]


> Виталий ©   (12.07.10 21:33) [121]

Читать книги БЕССИСТЕМНО - почти вредно. Во всяком случае, пользы от такого чтения - немного.


 
Sha ©   (2010-07-12 21:50) [123]

> Юрий Зотов ©   (12.07.10 21:30) [119]
> Блин. Он таки ударился в страничные файлы. И даже дальше - в MMF полез.
> Саш, ну и на фига? Вот скажи - на фига? Разве ЭТО ему сейчас надо?

Вообще-то, надо. Может, конечно не сразу. Никто не заставлял его туда лезть.

Первый вопрос, который возникнет после освоения типизированных файлов -
что делать, если я не знаю максимальных длину?

Ответ - нетипизированные файлы. Второй вопрос, который возникнет после
освоения нетипизированных файлов - как бы к ним приладить прямой доступ?

Тут появляется страничная организация, далее индексы и БД.


 
Юрий Зотов ©   (2010-07-12 21:55) [124]


> Sha ©   (12.07.10 21:50) [123]

Все правильно, но не сразу же? В школе ТФКП не изучают - не зря ведь.


 
Sha ©   (2010-07-12 21:58) [125]

> Юрий Зотов ©   (12.07.10 21:55) [124]
> Все правильно, но не сразу же?

От человека зависит.
Я лишь отвечаю на вопросы.
Не удивлюсь, если завтра Виталий кинется писать свой браузер.


 
Виталий ©   (2010-07-12 21:59) [126]

Не кинусь. Пока что написал код - не получается. В смысле пишет и читает, но, видимо, не так, как надо. Ищу ошибки.


 
Виталий ©   (2010-07-12 22:07) [127]

Надеюсь, у вас не пойдет кровь из глаз при виде этого ада
unit uMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TfrmMain = class(TForm)
   saveButton: TButton;
   loadButton: TButton;
   procedure saveButtonClick(Sender: TObject);
   procedure loadButtonClick(Sender: TObject);
 private
 { Private declarations }
 type
   PFriend = ^TFriend;

   TFriend = record
     FirstName: AnsiString;
     LastName: AnsiString;
     BirthDate: TDate;
     Phone: AnsiString;
   end;

 public
   { Public declarations }
 end;

var
 frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.loadButtonClick(Sender: TObject);
var
 Stream: TFileStream;
 test: PFriend;
 len: Integer;
begin
 Stream := TFileStream.Create("g:\test.dat", fmOpenRead);
 New(test);
 Stream.ReadBuffer(test^, sizeof(test^));

 Stream.ReadBuffer(len, sizeof(len));
 SetLength(test^.FirstName, len);
 Stream.ReadBuffer(pChar(test^.FirstName)^,Len);

 Stream.ReadBuffer(len, sizeof(len));
 SetLength(test^.LastName, len);
 Stream.ReadBuffer(pChar(test^.LastName)^,Len);

 Stream.ReadBuffer(len, sizeof(len));
 SetLength(test^.Phone, len);
 Stream.ReadBuffer(pChar(test^.Phone)^,Len);

 ShowMessage(test^.FirstName+" "+test^.LastName+" "+DateToStr(test^.BirthDate)+" "+test.Phone);

 dispose(test);
 Stream.Free;
end;

procedure TfrmMain.saveButtonClick(Sender: TObject);
var
 test: PFriend;
 Stream: TFileStream;
 s, s1, s2: AnsiString;
 len: Integer;
begin
 Stream := TFileStream.Create("g:\test.dat", fmOpenReadWrite);
 New(test);
 { эта инициализация будет заранее и сделана пользователем }
 test^.FirstName := "Иван";
 test^.LastName := "Петров";
 test^.BirthDate := Now;
 test^.Phone := "222-22-22";

 { так нужно сделать для корректной записи строк - то, что я нашел }
 s := test^.FirstName;
 test^.FirstName := "";
 s1 := test^.LastName;
 test^.LastName := "";
 s2 := test^.Phone;
 test^.Phone := "";

 Stream.WriteBuffer(test^, sizeof(test^));
 len := Length(s);
 Stream.WriteBuffer(len, sizeof(len));
 Stream.WriteBuffer(pChar(s)^, len);
 len := Length(s1);
 Stream.WriteBuffer(len, sizeof(len));
 Stream.WriteBuffer(pChar(s1)^, len);
 len := Length(s2);
 Stream.WriteBuffer(len, sizeof(len));
 Stream.WriteBuffer(pChar(s2)^, len);
 Stream.Free;

 dispose(test);
end;

end.


 
Юрий Зотов ©   (2010-07-12 22:07) [128]


> Sha ©   (12.07.10 21:58) [125]

Ну, мы же, как старшие и более опытные товарищи, его остановим? Предостережем от такой глупости, верно?
:о)

Парень-то ведь толковый, почитай его посты. Каша у него пока что в голове - ну так это потому что САМ учится, системы нет. Созреет потихоньку, сам знаешь, как оно происходит.

> Виталий

Но процесс созревания пойдет гораздо легче и быстрее, если не хвататься сразу за Рихтера, а читать сначала то, что советуют. Книги Рихтера - отличные, и перевод хороший - но они далеко не для тех, кто пока еще задает вопросы о битовых масках. Всему свое время.


 
Виталий ©   (2010-07-12 22:08) [129]

Юрий, спасибо за добрые слова. А теперь материте нещадно и говорите, как переписать это, чему место только на govnokod.ru.


 
Sha ©   (2010-07-12 22:19) [130]

> Юрий Зотов ©   (12.07.10 22:07) [128]
> Предостережем

Пробовал, не помогает


 
Виталий ©   (2010-07-12 22:22) [131]


> Пробовал, не помогает

я буду стараться следовать рекомендациям, которых, чувствую, немало получу.


 
Sha ©   (2010-07-12 22:24) [132]

> Виталий ©   (12.07.10 22:08) [129]
> теперь материте

Многовато чтений придется сделать, чтобы добраться до 100-й записи.
А если надо 100000-ую?


 
Anatoly Podgoretsky ©   (2010-07-12 22:24) [133]

> Sha  (12.07.2010 17:30:36)  [96]

Это не хитрый, это садист.


 
Виталий ©   (2010-07-12 22:27) [134]


> Многовато чтений придется сделать, чтобы добраться до 100-
> й записи.
> А если надо 100000-ую?

Тоже об этом думал. Вероятно, в начале файла нужно что-то вроде индексной таблицы смещений записей, чтобы процедурами типа Seek быстро перейти на нужное место?


 
Anatoly Podgoretsky ©   (2010-07-12 22:27) [135]

> Юрий Зотов  (12.07.2010 17:42:38)  [98]

Дак это дидактика.
Задачка конечно хорошая для тренировки.


 
Sha ©   (2010-07-12 22:30) [136]

> Виталий ©   (12.07.10 22:07) [127]
> так нужно сделать для корректной записи строк - то, что я нашел

Зачем эти танцы с бубном?


> Anatoly Podgoretsky ©   (12.07.10 22:24) [133]
> Это не хитрый, это садист.

))


 
Anatoly Podgoretsky ©   (2010-07-12 22:31) [137]

> Виталий  (12.07.2010 17:53:41)  [101]

Тебе решать, мы посмотреть


 
Anatoly Podgoretsky ©   (2010-07-12 22:32) [138]

> Виталий  (12.07.2010 20:38:44)  [104]

Это говорит о полном непонимание, как минимум типизированых файлов, и не
чтение нашей с ЮЗ перепиской, должен был бы насторожиться.


 
Виталий ©   (2010-07-12 22:32) [139]


> Зачем эти танцы с бубном?

Укажите на танцы другого рода.
"Обратите внимание на то, что перед записью в поток я делаю так, что бы в поле f3 попал указатель Nil. Если этого не сделать, то в поток попадет адрес текущего экземпляра динамической строки. При чтении, он будет прочитан в поле f3. Т.е. поле f3 станет указывать на какое-то место в памяти. При выполнении SetLength, поскольку Delphi сочтет что текущее значение f3 лежит по указанному адресу, будет попытка интерпретировать лежащую там информацию как динамическую строку. Если же в поток записать Nil, то SetLength, никуда лезть не будет – экземпляра-то нет."
(http://sources.ru/magazine/0804/delphistr.html)


 
Sha ©   (2010-07-12 22:33) [140]

> Виталий ©   (12.07.10 22:27) [134]
> в начале файла нужно что-то вроде индексной таблицы

С размером этого начала как быть?
Если записи добавлять-удалять придется.


 
Anatoly Podgoretsky ©   (2010-07-12 22:34) [141]

> Виталий  (12.07.2010 21:08:52)  [112]

MSDN настолько велик, что никто точно не знает, что там есть.


 
Виталий ©   (2010-07-12 22:34) [142]


> Это говорит о полном непонимание, как минимум типизированых
> файлов

Да что уж там - об абсолютном, совершенном непонимании, что такое файл вообще... Обязательно так критиковать каждый вопрос?


 
Виталий ©   (2010-07-12 22:35) [143]


> С размером этого начала как быть?
> Если записи добавлять-удалять придется.

Вы правы. Тогда на данный момент ответа не знаю.


 
Sha ©   (2010-07-12 22:35) [144]

> Виталий ©   (12.07.10 22:32) [139]

а теперь своими словами


 
Anatoly Podgoretsky ©   (2010-07-12 22:36) [145]

> Виталий  (12.07.2010 21:29:58)  [118]

> Можно?

Нужно.
Нужна точка опоры для разговора.


 
Anatoly Podgoretsky ©   (2010-07-12 22:38) [146]

> Юрий Зотов  (12.07.2010 21:30:59)  [119]

Юрий одно из направлений обучение - это сбивание с толку, для проверки
зрелости, посмотреть ходы. Если не собьется, то хорошо, а иначе только и
будет метаться из стороны в сторону.

Лиса, ты меня не путай
(с) кот Базилио


 
Sha ©   (2010-07-12 22:38) [147]

> Anatoly Podgoretsky ©   (12.07.10 22:32) [138]
> Это говорит о полном непонимание, как минимум типизированых файлов

Он их типа прошел уже, слишком просто, наверно.


 
Anatoly Podgoretsky ©   (2010-07-12 22:39) [148]

> Юрий Зотов  (12.07.2010 21:55:04)  [124]

ЮЗ ты плавать умеешь?
А как тебя учили?


 
Виталий ©   (2010-07-12 22:40) [149]


> а теперь своими словами

да там вроде тоже не сухой академический текст... Я понял как:
возникает проблема с тем, что неизвестен размер строки, и запишем в файл мы черти что (адрес в памяти), ведь AnsiString - указатель, только скрытый реализацией (так же?). Поэтому мы присвоим полю записи пустую строчку, то есть по сути присвоим указателю значение Nil, а действительные строки и их длины запишем после структуры. И когда будет вызываться SetLength (выделение памяти под строку), то оно не будет выделять память для данных по несуществующему адресу: nil увидит и закончит работу.


 
Виталий ©   (2010-07-12 22:42) [150]


> Он их типа прошел уже, слишком просто, наверно.

возможно, там и есть какой-то очень сложный момент, которого я не увидел. Но мне кажется, что меня старательно прессингуют, мол, офигел, узнать что-то захотел: с пути сбивают, критика и так далее :) может, так и надо.


 
Виталий ©   (2010-07-12 22:43) [151]

А если без шуток, то действительно весьма сильный напряг на психику. Но это так, оффтоп.


 
Sha ©   (2010-07-12 22:48) [152]

> Виталий ©   (12.07.10 22:40) [149]

Когда именно возникнет проблема?


 
Anatoly Podgoretsky ©   (2010-07-12 22:49) [153]

> Виталий  (12.07.2010 22:07:07)  [127]

Материть не буду, но несколько замечаний.

1. Код опасный, надо писать с защищеными блоками try finally
обучись как можно раньше.

2. Не понятно зачем test типа PFriend, удобнее TFriend - это не ошибка

3. Код желательно переделать так, чтобы убрать поля len, повышает
безопасность, упрощает работу, можно использовать файлы Паскаля и если еще
немного переделать, то и строковые списки. TFileStream очень низкий уровень,
но им конечно тоже надо владеть. Но здесь лучше изменить формат записи и
файловые операции.

Ну и если не обращать внимания на выше приведеные заявления, то неплохо, я
ожидал хуже.


 
Anatoly Podgoretsky ©   (2010-07-12 22:53) [154]

> Виталий  (12.07.2010 22:27:14)  [134]

Ну вот тебя и стали отвлекать на несвоевременные задачи. Дидактически
правильно. Надо же научить не отвлекаться на неважное на данном этапе. Пока
ты слишком поддаешься постороннему влиянию. А ты учти, что мы будем тебя
путать и смотреть, путать и смотреть. Это очень важно точно поставить цель,
пути решения и не перепрыгивать через ходы.


 
Виталий ©   (2010-07-12 22:53) [155]

Спасибо, Анатолий. Просто теперь Sha говорит о необходимости быстрого доступа к записям, и я понимаю, что это, возможно, реализация своей примитивной базы данных внутри файла, но, увы, не знаю как это сделать правильнее. Однако, думаю, ее будет возможно сделать только с помощью низкого уровня доступа к файлам.

> Когда именно возникнет проблема?

Ну собственно возникает в голове при решении задачи) Есть структура, есть поля у нее, их тип и значение известны, а размер - нет. Собственно, это и есть обходной путь чтобы записать данные так, чтобы и значение сохранилось, и длина.


 
Anatoly Podgoretsky ©   (2010-07-12 22:53) [156]

> Sha  (12.07.2010 22:30:16)  [136]

Я не осуждаю :-)
Я сам такой.


 
Anatoly Podgoretsky ©   (2010-07-12 22:55) [157]

> Виталий  (12.07.2010 22:32:19)  [139]

Кстати к трем предыдущим замечаниям, программа должна работать не только с
правильными данными, например любое поле может быть пустым и это надо
учитывать.


 
Виталий ©   (2010-07-12 22:57) [158]


>  например любое поле может быть пустым и это надо
> учитывать.

с этим вроде бы проблем не возникает. Но, думаю, тут уже скорее проверка ввода пользователя.


 
Anatoly Podgoretsky ©   (2010-07-12 22:57) [159]

> Виталий  (12.07.2010 22:34:22)  [142]

> Обязательно так критиковать каждый вопрос?

Ты сам просил, или ты хочешь что бы мы только хвалили, тогда тема не будет
иметь никакого смысла.
Самое ценное в ней именно критические замечания, посколько они позволяют
двигаться вперед.
Ну если не хочешь, то тему можно закрывать.


 
Виталий ©   (2010-07-12 22:59) [160]

Нет, я адекватно воспринимаю критику, просто немного растерялся. Теперь я собран и больше этого не повторится.



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 вся ветка

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

Наверх




Память: 0.84 MB
Время: 0.055 c
2-1281735892
Германн
2010-08-14 01:44
2010.11.07
Named pipes


2-1281896457
XillVikler
2010-08-15 22:20
2010.11.07
слежение за объектом


6-1228900755
WeTeR
2008-12-10 12:19
2010.11.07
отправить изображение по сети


2-1281622671
RuCosinus
2010-08-12 18:17
2010.11.07
Проверить, имеет ли пользователь права администратора домена


2-1281772529
mm0
2010-08-14 11:55
2010.11.07
SetFocus из потока