Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранить большой объем текстовых данных в файл


BDRON ©   (2002-09-05 08:03:00) 

Подскажите, как можно сохранить данные объемом более 64 кб в файл. Операторы writeln и writestring выдают ошибку после того как файл становиться более 64 кб.


AndreyS   (2002-09-05 11:19:00) [1]

Если нужно просто вывести вычисленные цифры с коментариями (форматный вывод) без наворотов,
тоя я делаю очень просто. Так как процедура writeln имеет некоторые особенности,
то я ее не использую, а использую write и в конец записи в ней дописываю явно символ конца
стороки и перевода каретки (Chr(13), Chr(10)). Это спасает от некоторых неудобств в некоторых
случаях и весьма уневерсально (не зависит от изменений вносимых от версии к версии) и
просто есть наглядный конроль над строками файла. Можете файл размером в диск создать и
ничего не будет. Возможно, это примитивно, но зато очень универсально и просто.
Если речь идет не о текстовом файле есть другие методы.


Lord Raul   (2002-09-05 10:22:00) [2]

На мой взгляд эту проблему можно решить несколько проще, используя BlockRead/BlockWrite.


MBo   (2002-09-05 10:20:00) [3]

>BDRON
Кстати, writestring наводит на мысль об ini-файле, а они действительно в Win9X ограничены 64К


Петров Денис   (2002-09-05 10:15:00) [4]

Использовать класс TFileStream (бинарного потокового ввода-вывода в файлы). Здесь нет ограничения на размер файла, а вся информация записывается и считывается в двоичном виде (что для вывода символов аналогично обычной операции типа "writeln", только выводить надо не паскалевскую строку, а null-terminated string, которую в Паскале обозвали PChar). А код будет выглядеть примерно так:

...
var S: TFileStream;
Data: PChar;
...
begin
...
S := TFileStream.Create("large_text.txt", fmCreate);
{ выделяем память под строку }
Data := StrAlloc(Length("sample string...") + 1);
{ заполняем строку данными }
StrCopy(Data, "sample string...");
{ выводим строку в файл }
S.WriteBuffer(Data^, Length(Data) + 1);
S.Free;
...
end;

Немного о функции WriteBuffer. Она пытается записать в поток то количество байт из буфера (на который указывает ее первый параметр), которое задано вторым ее параметром. Если это невозможно, то генерируется исключение. Так что ее лучше использовать в блоке try...except. Если это не удобно, то лучше пользоваться функцией Write. Спецификация у нее та же, но она пишет в поток столько байт, сколько возможно, и возвращает число записанных байт в точку вызова (не генерируя исключение в случае неполной записи данных в поток).


MBo   (2002-09-05 08:12:00) [5]

не замечал...


Наверх

Титульная страница Поиск, карта сайта Написать письмо