|
|
Регистрация | << Правила форума >> | 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; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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) Хочу все знать! Проблема в том что не хочу учиться |