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

Вниз

Запись в файл переменной типа 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
6-21186
VID
2002-08-05 13:48
2002.10.07
Проблема при дисконнекте


3-20884
_Vlad_
2002-09-16 12:45
2002.10.07
работа с *.dbf *.dbt из Delphi без BDE


14-21274
Карелин Артем
2002-09-13 12:09
2002.10.07
Здесь есть незамужние двушки?


1-21039
Fast
2002-09-27 11:15
2002.10.07
Неявное сравнение строк


1-21145
kex86
2002-09-26 01:33
2002.10.07
Люди, почему в кладовку не кладется моя программа?