Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
Юрий Зотов ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.82 MB
Время: 0.052 c
15-1280222834
12
2010-07-27 13:27
2010.11.07
О "природных" и "противоприродных" видах оружия


15-1279916973
Юрий
2010-07-24 00:29
2010.11.07
С днем рождения ! 24 июля 2010 суббота


4-1240991885
Zalum
2009-04-29 11:58
2010.11.07
Передать работающему приложению параметры


15-1280386453
бумбум
2010-07-29 10:54
2010.11.07
Имеет смысл ADOConnection1.Open ?


2-1281735892
Германн
2010-08-14 01:44
2010.11.07
Named pipes





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский