Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.03.2015, 22:28
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию Чтение из файла. UTF-8

Задача такая: найти в файле с кодировкой UTF-8 определенную строку (.fb2 основан на xml, нужно содержимое определенных тегов), для того что-бы разобраться, как происходит считывание из файла набрасал код:
Код:
var
  Form1: TForm1;
  F: TextFile;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 AssignFile(F,'Klarkson.fb2');
 Reset(F);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 CloseFile(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
var s: UTF8String;
begin
 Memo1.Clear;
 Readln(F,s);
 Memo1.Lines.Append(Utf8ToAnsi(s));
end;
Как я понял AssignFile(F,'Klarkson.fb2'); Reset(F); , так сказать подготавливают файл к чтению (записи), а Readln(F,s); считывает из файла построчно, т.е. чтения всего файла не происходит.
Проблемма в том, что, фактически файл состоит из двух строк - первая примерно такого вида: <?xml version="1.0" encoding="UTF-8"?>, а вторая - все остальное (включая изображения). Т.е. для того что-бы выудить из строки нужное содержимое, надо в эту строку считать весь файл, а искомый текст находится, как правило, в самом начале файла. Задача состоит в том, что-бы считывать из файла пока не будет найдено искомое, а дальше можно смело закрывать файл.
Ответить с цитированием
  #2  
Старый 21.03.2015, 22:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Скачать какой-нить SAX-парсер. Он читает файл по кусочкам.
2. Читать файл по кусочкам самому, через, например, File Of Byte или через поток (TFileStream).
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Помидоркин (21.03.2015)
  #3  
Старый 22.03.2015, 08:26
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Я бы просто XML парсер бы взял. Не думаю, что найдутся fb2 книги, размером в несколько сотен мегабайт.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Помидоркин (22.03.2015)
  #4  
Старый 22.03.2015, 13:59
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Я бы просто XML парсер бы взял. Не думаю, что найдутся fb2 книги, размером в несколько сотен мегабайт.
В данном случае, думаю, больше подойдет SAX-парсер. Долго искал
Цитата:
Сообщение от lmikle
какой-нить SAX-парсер
так ни чего и не нашел.
Пробовал поставить LibXmlParser (Author : Stefan Heymann), вроде установл, но выдает ошибку. К тому-же не нашел документации на русском (английским к сожалению не владею), нашел только, как использовать SAX-парсер на примере Java. В общих чертах понял так: подсовываем парсеру наш файл, запускаем, при возникновении определенной ситуации (например парсер натыкается на какой-нибудь тэг) возникает соответствующее событие, на которое нужно написать обработчик. Как это сделать в Дельфи непонятно.
Ответить с цитированием
  #5  
Старый 22.03.2015, 15:31
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Фигня "ваши" парсеры, в смысле не для данной, они, задачи. А вот File Of Byte, в данном случае, то что нужно (еще раз спасибо lmikle), пришлось повозиться с кодировкой, но вроде разобрался.
Ответить с цитированием
  #6  
Старый 22.03.2015, 18:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну и молодец, что разобрался.
Ты ж задачу описал довольно обще, вот и получил несколько разных вариантов решения.

ЗЫ. Первая же ссылка в гугле по поводу Delphi saz xml parset:
http://saxforpascal.sourceforge.net/
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter