Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Файловые потоки 
:(
    Опции темы
Alex
Дата 2.11.2004, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Теперь разберем возможности работы потомка TStream - TFileStream - файловый поток. Этот класс был специально введен для работы с файлами. Для работы с файловым потоком Вам надо записать в Uses модули classes, Sysutils (classes - включает в себя собственно определение класса, Sysutils - некоторые константы необходимые для работы). 

Вот пример записи/перезаписи файла: 

Код
Procedure WriteFileUsingStream(s, FileName:string); 
begin 
 with TFileStream.create(FileName, fmCreate or fmOpenWrite) do  
 
  
 try  
 
  
 write(pointer(s)^,length(s));  
 
  
 finally  
 
  
 free;  
 
  
 end;  
 
  
end;
 


Теперь небольшой разбор: 

TFileStream.create - конструктор класса, его вызов требует указания имени файла и опций его открытия, следующие опции определены: 

fmCreate = $FFFF; 
fmOpenRead = $0000; 
fmOpenWrite = $0001; 
fmOpenReadWrite = $0002; 
fmShareCompat = $0000; 
fmShareExclusive = $0010; 
fmShareDenyWrite = $0020; 
fmShareDenyRead = $0030; 
fmShareDenyNone = $0040; 

Теперь метод Write - этим методом в файл пишется любая информация из буфера любого типа, Вам надо указать только буффер и количество записываемых байтов. В данном случае используется переменная типа String в качестве буффера, но так как для длинных строк она представляет собой лишь указатель, то конструкция "pointer(s)^" заставляет обращаться именно к ее содержимому. 

А вот этот код демонстрирует чтение файла с использованием файлового потока: 

Код
var p:PChar; 
begin 
 GetMem(p, 255);  
 
 with TFileStream.create('c:\myText.txt', fmOpenReadWrite) do  
 
  
 try  
 
  
 Seek(10,soFromBeginning);  
 
 read(p^, 254);  
 
  
 finally  
 
  
 free;  
 
  
 end;  
 
  
 showmessage(p);  
 
 FreeMem(p);  
 
  
end;
 

И пояснения к коду: 
1) Никаких проверок длину файла и его наличие здесь не делается - это демонстрационный код, а не готовая процедура чтения. 
2) Файл мы считываем в буффер типа PChar (с тем же успехом можно использовать массив или любой другой контейнер). Для тех кто не помнит - процедуры GetMem(p, 255) и FreeMem(p) - распределение памяти для строки и освобождение памяти. 
3) Метод потока Seek позволяет установить текущую позицию считывания/записи файла. Первый параметер - номер байта, второй - это от чего считать этот байт (у нас считать от начала файла), возможны варианты: 
soFromBeginning - от начала файла 
soFromCurrent - от текущей позиции считывания 
soFromEnd - от конца файла (в этом случае номер байта должен быть отрицательным или равным нулю) 
4) Собственно считывание из потока осуществляется методом read, в котором указывается в качестве параметров буфер в который мы читаем и желаемое количество байт для чтения. Метод read является функцией, которая возвращает количество байт реально прочитанных из потока. 

Заканчивая о файловых потоках хочу упомянуть о методе 
CopyFrom который позволяет перекачивать информацию из одного потока в другой и о свойствах: 

Size - размер файла 
Position - текущая позиция чтения/записи потока 

Работа с файловыми потоками весьма быстра, этот класс, являсь классом VCL, в то же время базируется на низкоуровневых функциях Windows, что обеспечивает очень высокую скорость работы и стабильность операций. К тому же многие компоненты и классы VCL поддерживаю прямое чтение и запись с файловыми потоками, что занчительно упрощает работу - например TStringList, TBlobField, TMemoField и другие. 
Файловые потоки могут быть рекомендованы к использованию в большинстве случаев для чтения и записи файлов (за исключением специфических ситуаций, требующих каких-то других подходов), другими словами если вам надо просто записать или считать файл, используйте файловые потоки.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.