Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.02.2009, 15:05
dixter dixter вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 22
Репутация: 10
По умолчанию Помогите пожалуйста разобраться

Как используя тип TFileStream можно записать данные в файл в виде:
Код:
User=record     
Name:string;      
pass:string;
r1:boolean;
r2:boolean;
end;

сначало как обычно
f:TFileStream;
f:=create({тут параметры});
А как далше?
__________________
Хочу все знать! Проблема в том что не хочу учиться
Ответить с цитированием
  #2  
Старый 09.02.2009, 15:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,036
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если можешь ограничить строковые поля до 255, то поправь запись, а далее через WriteBuffer. Если не можешь ограничить, то придется писать по полям (т.е. каждое поле отдельно).
Ответить с цитированием
  #3  
Старый 09.02.2009, 17:02
dixter dixter вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 22
Репутация: 10
По умолчанию

сделал так:
Код:
//запись
u:user;
f.write(u,sizeof(user));
f.free;
Код:
//чтение
f.read(u,sizeof(user));
f.free;

вроде работает, а зачем ограничивать то строковые поля?
__________________
Хочу все знать! Проблема в том что не хочу учиться
Ответить с цитированием
  #4  
Старый 12.02.2009, 10:05
dixter dixter вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 22
Репутация: 10
По умолчанию

Теперь понял почему надо ограничивать строки. Вот если кому интересно:
Ограничивать надо потому что переменная типа string (неограниченная) содержит адрес на память где строка хранится и при записи в файл сохраняется этот адрес, а не сама строка.
Кстати пример выше работает только если запись и чтение происходит в одном процессе т.е. запистили приложение записали, прочитали, если сохранить а при следующем запуске приложения прочитать файл то в переменной будет что нибудь непонятное или вообще ничего(мусор) насколько я понял это потому что, по тому адресу что записался в файл находится уже что нибудь другое или нет ничего.
Надеюсь я правильно понял, ели не так не ругайтесь а просто поправьте меня.
__________________
Хочу все знать! Проблема в том что не хочу учиться
Ответить с цитированием
  #5  
Старый 12.02.2009, 11:01
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Ограничивать надо потому, что в строку "помещается" только 255 символов, не более.

Н-р, запись var f:String[100] говорит нам что, переменная, представленная в виде строки, ограничена сотней символов, не более.
Ответить с цитированием
  #6  
Старый 12.02.2009, 11:06
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Код:
User=record     
Name:string[100];      
pass:string[100];
r1:boolean;
r2:boolean;
end;

var
BIR: User;

.......................
FileStream.Write(BIR, SizeOf(BIR));
........................
Ответить с цитированием
  #7  
Старый 12.02.2009, 11:07
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Код:
User=record     
Name:string[100];      
pass:string[100];
r1:boolean;
r2:boolean;
end;

var
BIR: User;

BIR.Name:='Имя';// и т.д.
.......................
FileStream.Write(BIR, SizeOf(BIR));
........................
Ответить с цитированием
  #8  
Старый 12.02.2009, 13:12
dixter dixter вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vayrus
Ограничивать надо потому, что в строку "помещается" только 255 символов, не более.
Почему же только 255 символов? В переменную типа String можно записать намного больше символов, кажется около 4 млрд.
А вот когда ограничиваем строку, то она становиться подобна типу ShortString вот такая строка не может содержать больше 255 символов.
И ограничивать сдесь строку нужно совсем по другой причине.
__________________
Хочу все знать! Проблема в том что не хочу учиться
Ответить с цитированием
  #9  
Старый 12.02.2009, 14:00
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Если строка более 255 байт, могут возникнуть проблемы при записи ее в TFileStream.
Можно записать так:
Код:
var a:char;
begin
for i:=1 to length(text) do
  begin
    a:=text[i];
    FileStream.Write(a,1);
  end;
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #10  
Старый 12.02.2009, 14:18
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

никаких проблем с длинными строками нет. код для строк любой возможной длины:
Код:
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;
обязательно читать и писать надо в str[1] а не в str
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #11  
Старый 12.02.2009, 14:39
dixter dixter вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 22
Репутация: 10
По умолчанию

Кстати вместо str[1] можно еще использовать такой вариант pointer(str)^
__________________
Хочу все знать! Проблема в том что не хочу учиться
Ответить с цитированием
  #12  
Старый 12.02.2009, 15:22
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Цитата:
Сообщение от dixter
Кстати вместо str[1] можно еще использовать такой вариант pointer(str)^
насколько я знаю там хранится адрес str[0]
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #13  
Старый 12.02.2009, 15:28
dixter dixter вне форума
Прохожий
 
Регистрация: 28.01.2009
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
Сообщение от KOOL
насколько я знаю там хранится адрес str[0]
адрес храниться будет в pointer(str), смотри внимательнее pointer(str)^
^ - указывает что данные беруться по адресу pointer(str)
__________________
Хочу все знать! Проблема в том что не хочу учиться
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter