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

Вниз

Проблема при записи в файл   Найти похожие ветки 

 
Spb   (2003-12-17 08:57) [0]

Допустим я создаю свой тип
type TMyType=record
a, b, c:string;
end;
var x:TMyType;

И хочу всё это записывать в файл
var f:file of TMyType;

На что Delphi выдаёт ошибку Type TMyType needs finalization - not allowed in file type
То есть надо сделать так a, b, c:string[255];

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

Другой вариант создать файл текстового (textfile) типа и писать каждую строчку отдельно:
write(f, x.a);
write(f, x.b);
write(f, x.c);

Но это для меня не совсем удобно.
А если оперировать с записью, то файл будет сильно разрастаться, да и потом, может у меня будут строки длиннее 255 символов.

Что посоветуете?


 
Anatoly Podgoretsky ©   (2003-12-17 09:14) [1]

writeln(f, x.a);
writeln(f, x.b);
writeln(f, x.c);


 
Внук ©   (2003-12-17 09:20) [2]

Для записи в типизированный файл размер записи должен быть постоянным и известным на этапе компиляции. Посоветую писать вручную в бинарный файл с предуказанием длины каждого поля записи.


 
alex_***   (2003-12-17 09:25) [3]

Тогда доступ будет последовательный, что зачастую неудобно.


 
Внук ©   (2003-12-17 09:28) [4]

Угу, придется выбирать. Или устанавливать ограничение на длину строки и мириться с полупустым файлом, или так.


 
Spb   (2003-12-17 18:46) [5]

Наверное сделаю всё-таки текстовый файл
writeln(f, x.a);
writeln(f, x.b);
writeln(f, x.c);

Только ещё один вопрос, как мне сразу перейтик нужной строке, вроде seek() в текстовом файле не работает.
Или только последовательно, если мне нужно к 10-ой строке, то
while i<10 do
begin
readln(f, str);
inc(i);
end;

А можно ли писать информацию в начало файла, а не в конец, чтобы вся остальная информация просто сдвинулась.

И последний вопрос: как удалить конкретную сроку, или надо будет по новой файл формировать (читать до нужной строки, эту сроку пропускать, читать дальше, и потом новый файл записывать без это строки)?


 
Sandman25 ©   (2003-12-17 18:50) [6]

Или только последовательно

Да.

А можно ли писать информацию в начало файла, а не в конец, чтобы вся остальная информация просто сдвинулась

Нет.

или надо будет по новой файл формировать

Да.


 
Spb   (2003-12-17 18:57) [7]

Как то гемморойно получается, если у меня очень большое количество строк в файле, и нужно удалить какую нибудь одну строчку в конце, то это много времени будет занимать.
С типизированными файлами также?
Никак попроще и побыстрее нельзя?


 
Плохиш_   (2003-12-17 19:04) [8]

>Spb (17.12.03 18:46) [5]
> readln(f, str);
readln(f);

>Spb (17.12.03 18:57) [7]
Текстовые файлы не поддерживают обращения к произвольному символу. И при удалении тебе придётся переписать весь файл за исключением удаляемой строки в новый.

> Никак попроще и побыстрее нельзя?

Перейти на бд не пробовал?


 
Spb   (2003-12-17 19:15) [9]

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

А в типизированных файлах удалять также придётся (то есть заново файл переписывать)? Но там хотя бы сразу можно к нужной позиции перейти (seek()). Но опять таки, эти ограницения с заранее известным размером...


 
Рамиль ©   (2003-12-17 19:20) [10]


> А в типизированных файлах удалять также придётся (то есть
> заново файл переписывать)?

Файл есть файл, ничего тут не сделаешь.


 
Anatoly Podgoretsky ©   (2003-12-17 19:25) [11]

Spb (17.12.03 19:15) [9]
"их очень много будет." - это сколько и какой средний размер строки?


 
Spb   (2003-12-17 20:18) [12]

Средний размер строки допустим 100 символов. А количество строк, в принципе неограничено, ну предположим у меня будет порядка 10.000-30.000 строк


 
Тимохов ©   (2003-12-17 20:22) [13]

Скажем так, объемы небольшие.
Вполно можно удалять и вставлять перезаписью файла.
При этом ограничиться string[100] и типизированным файлом рекордов.


 
Anatoly Podgoretsky ©   (2003-12-17 20:40) [14]

30000*100= 3 иб, значит самое то, чтобы использовать TStringList и в этом случае все размышления по поводу вставки и удаления уходят в сторону.


 
Spb   (2003-12-17 21:34) [15]

То есть, сначала всё загружать в TStringList, проволить какие нужно операции и потом сохранять обратно в файл?


 
Anatoly Podgoretsky ©   (2003-12-17 22:27) [16]

Именно так, будет очень просто работать



Страницы: 1 вся ветка

Текущий архив: 2003.12.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
1-99592
h0use
2003-12-17 10:50
2003.12.30
Как в RichEdit Выводить строку с заданным стилем?


1-99517
Sour
2003-12-18 08:33
2003.12.30
Использование Delphi для WindowsCE


11-99509
DrFaust
2003-04-16 11:24
2003.12.30
Additional visual components (in other packages):


14-99770
vopros
2003-12-06 12:56
2003.12.30
Кто нибудь встречался с проблемой виса BDE


1-99538
djsash
2003-12-16 12:35
2003.12.30
Работа с Excel файлами... (нужна помощь)