Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-99539
V-Isa
2003-12-16 13:34
2003.12.30
Список функций и параметров из dll


1-99521
Виталя
2003-12-16 15:53
2003.12.30
Как откомпилировать приложение так чтобы оно работало с(без) dll


4-99828
SkyRanger
2003-11-03 14:45
2003.12.30
Аналог StrTo... и ...ToStr на WinAPI


11-99515
Юрий
2003-04-15 15:26
2003.12.30
ForceDirectories


7-99797
Tanya
2003-10-23 13:15
2003.12.30
Путь к выполняемому приложению





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский