Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизЗапись в файл переменной типа string. Найти похожие ветки
← →
Fredericco (2002-09-27 11:12) [0]Привет уважаемые мастера!
У меня вот такой вопрос. Есть рекорд
TMyRec=record
I:integer;
S:String[255];
end;
и файл
F:File of TMyRec;
Данная структура не может быть записана в файл если не указать длину строкиS
. Так вот, кто уже с этим сталкивался, подскажите пожалуйста как правильней всего записывать строки большей длины.
С уважением к Мастерам.
Fredericco.
← →
Anatoly Podgoretsky (2002-09-27 11:22) [1]Данная структура может быть записана в файл без указания длины строки S
← →
MBo (2002-09-27 12:43) [2]если в записи длинные строки или дин.массивы, File of TMyRec не пойдет, используй TFilestream, перед строкой записывая ее длину
← →
Fredericco (2002-09-27 13:49) [3]2Anatoly Podgoretsky © (27.09.02 11:22)
[Error] Unit1.pas(103): Type "TDriver" needs finalization - not allowed in file type
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"
2MBo © (27.09.02 12:43)
Расскажи пожалуйста, если не трудно, как организовать чтение/записьMyRec
через TFileStream, а то я сам не разобрался.
← →
Anatoly Podgoretsky (2002-09-27 13:58) [4]Ты уверен, что ты записываешь именно эту структуру, эту можно, а про другие надо отдельно говорить.
← →
Alx2 (2002-09-27 13:59) [5]у меня такая конструкция проходит (D5 & D6)
type
TMyRec=record
I:integer;
S:String[255];
end;
Var f : file of tmyrec;
:)
Если D4 таки упрямится (что вряд ли), то попробуй
type
TStrArray = array [0..255] of char;
TMyRec=record
I:integer;
S:TStrArray;
end;
Var f : file of tmyrec;
а при работе использовать приведение типов
но имхо неэкономны файлы такого типа.
← →
MBo (2002-09-27 14:00) [6]FS.write(Rec.I, SizeOf(rec.I));
L:=Length(rec.s);
FS.write(L, SizeOf(L));
Fs.Write(rec.s[1],L);
...
fs.read(rec.i,SizeOf(rec.I));
fs.read(L,sizeof(Integer));
SetLength(rec.s,L);
Fs.read(rec.s[1],L);
← →
Fredericco (2002-09-27 14:02) [7]2Anatoly Podgoretsky © (27.09.02 13:58)
Уверен. Только что проверил в новом проекте.
[Error] Unit1.pas(107): Type "TMyRec" needs finalization - not allowed in file type
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"
← →
Fredericco (2002-09-27 14:03) [8]2MBo © (27.09.02 14:00)
Спасибо большое!
← →
Alx2 (2002-09-27 14:03) [9]>Fredericco © (27.09.02 14:02)
Что то очень странное творится в королевстве датском :)
← →
Fredericco (2002-09-27 14:05) [10]2Alx2 © (27.09.02 14:03)
Может потому что у меня D4.
← →
Fredericco (2002-09-27 14:10) [11]2Alx2 © (27.09.02 14:03)
Прчти внимательней вопрос:
> Данная структура не может быть записана в файл если не указать
> длину строки S
То бишь:
TMyRec=record
I:integer;
S:String; // Не указав длину строки
end;
← →
Anatoly Podgoretsky (2002-09-27 14:14) [12]Я не из головы беру, откомпилировано без единого предупреждения и выполнено без единой ошибки, файл как и ожидалось оказался ровно 260 байт и строго нужного содержания.
У тебя яно не тот код, который приведен в сообщении Fredericco © (27.09.02 11:12)
Естественно не было нужды делать пратическую проверку, это только для тебя, что бы ты не мог утверждаать, мол проверь сначала.
← →
MBo (2002-09-27 14:16) [13]>Anatoly Podgoretsky
>Alx2
Новости телепатии:
Тот тип, который он привел, у него записывается, а если убирает [255] - тогда нет. Вот что он имел в виду
← →
Fredericco (2002-09-27 14:17) [14]>Anatoly Podgoretsky
>Alx2
Новости подробного чтения:
> Данная структура не может быть записана в файл если не указать
> длину строки S
← →
Alx2 (2002-09-27 14:28) [15]>Fredericco © (27.09.02 14:17)
> быть записана в файл если не указать
> длину строки S
Теперь все понятно.
НО!
Длина строки <> ее размерность :))
Длина = length
>MBo © (27.09.02 14:16)
Не открыл еще фирму по ясновидению? :)
← →
Alx2 (2002-09-27 14:29) [16]>Данная структура не может быть записана в файл если не указать
>длину строки S.
И потом, в выясненном смысле, эта структура уже не "данная".
← →
Anatoly Podgoretsky (2002-09-27 14:32) [17]MBo © (27.09.02 14:16)
Это будет другая структура, такая структура не имеет смысла для типизированныйх файлов, компилятор даже отказывается подобное компилировать. Налицо полное не понимание принципов.
Нужно использовать не типизированный файл, а двоичный с переменной структурой, с примером повторяться не буду, ты его привел в MBo © (27.09.02 14:00)
Мое сообщение Anatoly Podgoretsky © (27.09.02 11:22) и последующие только по приведенной структуре.
← →
Fredericco (2002-09-27 14:38) [18]Помимо приведенной структуры, был еще приведен текст, на прочтение которого автор вопроса рассчитывал.
← →
Fredericco (2002-09-27 14:42) [19]2Anatoly Podgoretsky © (27.09.02 14:32)
> Налицо полное не понимание принципов
Налицо невнимательное чтение.
← →
Рыжик (2002-09-27 14:52) [20]
> Anatoly Podgoretsky © (27.09.02 14:14)
> Я не из головы беру, откомпилировано без единого предупреждения
> и выполнено без единой ошибки, файл как и ожидалось оказался
> ровно 260 байт и строго нужного содержания.
> У тебя яно не тот код, который приведен в сообщении Fredericco
> © (27.09.02 11:12)
А у вас случайно не стоит {$H-}?
Потому что, если {$H+}, то ошибка должна быть.
← →
pasha_golub (2002-09-27 14:56) [21]
> Рыжик © (27.09.02 14:52)
Абсолютно прав (права)!!!
← →
Anatoly Podgoretsky (2002-09-27 15:03) [22]MBo © (27.09.02 14:00)
Если про String[255] то ошибки не будет, если просто про String, то для {$H-} это навносильно String[255] оно же ShortString без всяких директив
← →
Sectey (2002-09-27 15:06) [23]procedure WriteStr(str: string);
var
s : TFileStream;
l : integer;
begin
s := TFileStream.Create("sdsds",fmCreate);
l := length(str);
s.WriteBuffer(l,sizeof(l));
s.WriteBufffer(point(str)^,l);
s.Free
end;
function ReadStr: string;
var
s : TFileStream;
l : integer;
b : string;
begin
s := TFileStream.Create("sdsds",fmCreate);
s.ReadBuffer(l,sizeof(l));
SetLength(b,l);
s.ReadBufffer(point(b)^,l);
s.Free;
result := b;
end;
← →
Sectey (2002-09-27 15:08) [24]О Ш И Б С Я.
b : string;
begin
s := TFileStream.Create("sdsds",fmOpenRead);
s.ReadBuffer(l,sizeof(l));
← →
Fredericco (2002-09-27 15:08) [25]Sectey © (27.09.02 15:06)
Спасибо!
← →
Anatoly Podgoretsky (2002-09-27 15:18) [26]Рыжик © (27.09.02 14:52)
По ошибке MBO адресовал, для string[255] без разницы
← →
Рыжик (2002-09-27 15:26) [27]Имелось в виду, конечно, {$H+} для просто string. Сперва не правильно поняла, о чём речь. Прошу прощения за невнимательность.
← →
Alx2 (2002-09-27 15:26) [28]>Sectey © (27.09.02 15:08)
>Sectey © (27.09.02 15:08)
>О Ш И Б С Я.
И не только там.
← →
Sectey (2002-09-27 15:35) [29]Alx2 © (27.09.02 15:26)
В чем?
← →
Alx2 (2002-09-27 15:46) [30]
procedure WriteStr(str: string);
var
s : TFileStream;
l : integer;
begin
s := TFileStream.Create("sdsds",fmCreate);
l := length(str);
s.WriteBuffer(l,sizeof(l));
s.WriteBufffer( point(str)^,l);
s.Free
end;
function ReadStr: string;
var
s : TFileStream;
l : integer;
b : string;
begin
s := TFileStream.Create("sdsds",fmCreate);
s.ReadBuffer(l,sizeof(l));
SetLength(b,l);
s.ReadBufffer( point(b)^,l);
s.Free;
result := b;
end;
← →
Sectey (2002-09-27 15:52) [31]>Alx2 © (27.09.02 15:46)
Да все правельно.
Передаем записи и чтения данные string, а не переменную String.
← →
Fog (2002-09-27 15:54) [32]А что если
File of PChar;
.
.
.
Write(.., PChar(Твой стринг));
← →
Sectey (2002-09-27 15:59) [33]>Fog © (27.09.02 15:54)
В файл же надо сохранить данные, а НЕ АДРЕСА где располагаются данные.
← →
Alx2 (2002-09-27 16:05) [34]>Sectey © (27.09.02 15:52)
>Да все правельно.
point, конечно, не pointer - но это просто опечатка.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.01 c