Форум: "Прочее";
Текущий архив: 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.046 c