![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Как используя тип TFileStream можно записать данные в файл в виде:
Код:
User=record Name:string; pass:string; r1:boolean; r2:boolean; end; сначало как обычно f:TFileStream; f:=create({тут параметры}); А как далше? |
|
#2
|
|||
|
|||
|
Если можешь ограничить строковые поля до 255, то поправь запись, а далее через WriteBuffer. Если не можешь ограничить, то придется писать по полям (т.е. каждое поле отдельно).
|
|
#3
|
|||
|
|||
|
сделал так:
Код:
//запись u:user; f.write(u,sizeof(user)); f.free; Код:
//чтение f.read(u,sizeof(user)); f.free; вроде работает, а зачем ограничивать то строковые поля? |
|
#4
|
|||
|
|||
|
Теперь понял почему надо ограничивать строки. Вот если кому интересно:
Ограничивать надо потому что переменная типа string (неограниченная) содержит адрес на память где строка хранится и при записи в файл сохраняется этот адрес, а не сама строка. Кстати пример выше работает только если запись и чтение происходит в одном процессе т.е. запистили приложение записали, прочитали, если сохранить а при следующем запуске приложения прочитать файл то в переменной будет что нибудь непонятное или вообще ничего(мусор) насколько я понял это потому что, по тому адресу что записался в файл находится уже что нибудь другое или нет ничего. Надеюсь я правильно понял, ели не так не ругайтесь а просто поправьте меня. |
|
#5
|
||||
|
||||
|
Ограничивать надо потому, что в строку "помещается" только 255 символов, не более.
Н-р, запись var f:String[100] говорит нам что, переменная, представленная в виде строки, ограничена сотней символов, не более. |
|
#6
|
||||
|
||||
|
Код:
User=record Name:string[100]; pass:string[100]; r1:boolean; r2:boolean; end; var BIR: User; ....................... FileStream.Write(BIR, SizeOf(BIR)); ........................ |
|
#7
|
||||
|
||||
|
Код:
User=record Name:string[100]; pass:string[100]; r1:boolean; r2:boolean; end; var BIR: User; BIR.Name:='Имя';// и т.д. ....................... FileStream.Write(BIR, SizeOf(BIR)); ........................ |
|
#8
|
|||
|
|||
|
Цитата:
А вот когда ограничиваем строку, то она становиться подобна типу ShortString вот такая строка не может содержать больше 255 символов. И ограничивать сдесь строку нужно совсем по другой причине. |
|
#9
|
||||
|
||||
|
Если строка более 255 байт, могут возникнуть проблемы при записи ее в TFileStream.
Можно записать так: Код:
var a:char;
begin
for i:=1 to length(text) do
begin
a:=text[i];
FileStream.Write(a,1);
end; |
|
#10
|
||||
|
||||
|
никаких проблем с длинными строками нет. код для строк любой возможной длины:
Код:
procedure Save;
var l:integer;
S:TFileStream;
begin
S:=TFileStream.Create('path', fmCreate);
l:=length(str); //запоминаем длину строки
S.Write(l, sizeof(integer)); //пишем ее в поток
S.Write(str[1], l); //пишем саму строку
end;
procedure Load;
var l:integer;
S:TFileStream;
begin
S:=TFileStream.Create('path', fmOpenRead);
S.Read(l, sizeof(integer)); //читаем длину строки
setLength(str, l); //задаем длину
S.Read(str[1], l); //читаем строку
end; |
|
#11
|
|||
|
|||
|
Кстати вместо str[1] можно еще использовать такой вариант pointer(str)^
|
|
#12
|
||||
|
||||
|
Цитата:
|
|
#13
|
|||
|
|||
|
Цитата:
^ - указывает что данные беруться по адресу pointer(str) |