Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2008, 20:29   #1
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию Работа с файлами.Строки в записях.

Всем привет!
Столкнулся я с такой проблемой.Пришлось мне сохранять Record в файл.
Ну например у меня вот такой рекорд
Код:
Trec=record
  a:integer;
  l:integer;
  s:string;
end;
потом пишу код

Код:
var
t:Trec;
f:file of Trec;
begin
Assignfile(f,'aa.txt');
t.a:=1;
t.l:=3;
setlength(t.s,3);
t.s:='111';
write(f,#9+t);
closefile(f);
Вопрос 1.
У меня выдает вот такую ошибку
[DCC Error] Unit1.pas(34): E2155 Type 'Trec' needs finalization - not allowed in file type в строке f:file of Trec;
как мне избежать ошибку?

Вопрос 2.
Как можно еще сохранять строки в файл более экономично по размеру?
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 19.07.2008, 22:21   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Вопрос 1.
У меня выдает вот такую ошибку
[DCC Error] Unit1.pas(34): E2155 Type 'Trec' needs finalization - not allowed in file type в строке f:file of Trec;
как мне избежать ошибку?
Для записи структуры в файл необходимо финализировать строки, на этом построен принцип типизированных файлов, на известном заранее размере записи.
string1: string[255]; //255 это максимум

Цитата:
Вопрос 2.
Как можно еще сохранять строки в файл более экономично по размеру?
Типизированный файл для экономного хранения строк не подходит, его размер всегда будет больше, чем полезных данных в нем. К тому же длина строк ограничена.
Ответ прост - в обычный текстовый файл. 1 буква - 1 байт, перевод каретки - 2 байта.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 19.07.2008, 22:39   #3
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

вопрос был про записи именно record в файл. Все посты удалены.

В дополнении: что в текстовом, что в типизированном файле строки хранятся одинакого (1 символ = 1 байт, но вот перенос строки в типизированном файле так таковой не нужен). А вот числа в типизированном файле хранятся более экономно, чем в текстовом.
например число 12345 в текстовом файле будет записано как:
31|32|33|34|35 = 5 байт.
а в типизированном:
30|39 = 2 байта.
zetrix вне форума Ответить с цитированием
Старый 19.07.2008, 22:51   #4
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

вот я и спрашиваю как мне записывать record в файл.Мне надо чтобы в рекорде были строки и я мог указывать длину строки.Чтобы было экономичнее.Как мне это реализовать?
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 19.07.2008, 22:54   #5
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

ну надо знать максимальную длину текста, который вы будете загонять в стринг. и указать эту длину.
zetrix вне форума Ответить с цитированием
Старый 19.07.2008, 22:58   #6
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

а может как нибудь с
Str:Array of char;
Setlength(str,3);
str:='111';
write(f,str);
.......???
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 20.07.2008, 11:44   #7
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

это record? так то можно, но у вас уже текстовый файл будет, а не типизированный.
zetrix вне форума Ответить с цитированием
Старый 20.07.2008, 12:22   #8
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

вот код
Код:
type
Trec=record
  a:integer;
  l:integer;
  s:array of char;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
t:Trec;
f:file of Trec;
begin
Assignfile(f,'aa.txt');
t.a:=1;
t.l:=3;
setlength(t.s,3);
t.s:='111';
write(f,t);
closefile(f);

end;
Вот это не работает
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 20.07.2008, 13:33   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Так какой все таки нужен файл, обязательно типизированный или какой лучше подходит?

Я уже говорил, типизированный файл для экономного хранения строк не подходит (если размер не важен, то вполне подходит, в вашем распоряжении строки до 255 символов), он как контейнер с запасом, меньше записывать можно, но размер файла все равно будет предустановленный.

Поясню на примере
Код:
TMyRec = record
  str1: string[50];
  int1: integer;
  int2: word;
end;

TMyFile: file of TMyRec;
Каждая запись в таком файле будет равна 50 + 4 + 2 = 56 байт, независимо от записанных в нее данных, хоть пустую оставь. Размер файла будет равен кол-ву записей * 56 байт.
Если записывать в такой файл строки разной длины, к примеру в основном около 10 символов и лишь некоторые из них будут доходить до 50 символов, размер файла получиться в несколько раз больше чем фактически полезных данных в нем.
Исключение: если заранее известно, что все строки равны, тогда можно использовать типизированный файл со 100% "кпд".

В отличие от типизированного, размер текстового всегда равен реальному кол-ву полезных символов в нем. Именно это я и имел ввиду, а не то что строки как-то иначе хранятся.

Цитата:
Вот это не работает
И не будет работать, никакой неоднозначности не допускается, размер структуры должен быть заранее известен и ограничен. На этом основан принцип доступа к записи в типизированном файле. Я и это уже писал, читайте внимательнее.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 20.07.2008, 13:48   #10
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

ну хорошо убедили использовать обычный текстовый файл.
Но есть вопрос
Вот я например хочу записать много чисел и строк разной длины.
А как мне потом считывать их если я не знаю скока байтов мне надо считать с файла?
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с файлами в с++ kermit Помощь студентам 13 09.06.2008 02:21
работа с файлами Antonio86 Общие вопросы Delphi 0 20.01.2008 16:27
Работа с файлами Zenit10 Помощь студентам 2 19.01.2008 09:59