Форум: "Основная";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
ВнизПроблема при записи в файл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c