Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизTFileStream.Create или еще чего? Найти похожие ветки
← →
Pavelkq (2004-12-27 09:18) [0]Пытаюсь открывать вордовский файл. Чтение, как обычный текстовый файл не прокатывает. Пробую следующее:
procedure TForm1.Button1Click(Sender: TObject);
var name: string;
S: TFileStream;
Reader: TReader;
begin
Memo1.Lines.Clear;
if Form1.OpenDialog1.Execute then
name := OpenDialog1.FileName;
if name="" then exit;
S:=TFileStream.Create(name,fmOpenRead);
Reader := TReader.Create (S, 1024);
Reader.ReadListBegin;
while not Reader.EndOfList do
Memo1.Lines.Add (Reader.ReadString);
Reader.ReadListEnd;
Reader.Destroy;
S.Destroy;
end;
Все компилируется, но при выполнении (когда уже выбран файл) вылетает ошибка с сообщениемInvalid property value
.
Предполагаю, что тут объектTReader
плохо подходит. А что делать? Мне нужно просто считать в строковую переменную весь набор символов для дальнейшего анализа (можно за несколько циклов, т.е. кусками).
← →
Рамиль © (2004-12-27 09:27) [1]Если тебе нужен текст, то читай через Word.
← →
Pavelkq (2004-12-27 09:35) [2]Знаешь сколько времени ворд открывается? А если файлов 1500? А мне нужно вынуть всего лишь свойства.
В общем, мне нужен любой метод чтения набора символов (или их кодов) можно даже по одному.
← →
Рамиль © (2004-12-27 09:58) [3]Pavelkq (27.12.04 9:35) [2]
А зачем Word для каждого файла открывать?
А зачем тебе TReader понадобился? Он здесь совсем не к месту.
Используй TFileStream.Read
← →
Pavelkq (2004-12-27 10:01) [4]Попробовал из справки пример:
procedure TForm1.Button1Click(Sender: TObject);
var
H: Integer;
iFileLength: Integer;
iBytesRead: Integer;
Buffer: PChar;
i: Integer;
begin
if OpenDialog1.Execute then
begin
try
H := FileOpen(OpenDialog1.FileName, fmOpenRead);
iFileLength := FileSeek(H,0,2);
FileSeek(H,0,0);
Buffer := PChar(AllocMem(iFileLength + 1));
iBytesRead := FileRead(H, Buffer, iFileLength);
FileClose(H);
for i := 0 to iBytesRead-1 do
begin
Memo1.Lines.Add(String(Buffer[i]));
Memo1.Lines.Add(IntToStr(Integer(Buffer[i])));
end;
finally
FreeMem(Buffer);
end;
end;
end;
На строке передачи в мемо все вылетает.TFileStream.Read
пробовал, но тоже не пойму до конца, как его юзать. Вот бы кусок живого кода!
← →
Рамиль © (2004-12-27 10:19) [5]Pavelkq (27.12.04 10:01) [4]
Вот бы кусок живого кода!
Пожалуйста:)
var
F: TFileStream;
s: string;
F := TFileStream.Create("C:\1.doc", fmOpenRead);
SetLength(s, F.Size);
F.Read(s[1], F.Size);
Но только ответственность за интерпретацию полностью на тебе.
← →
Pavelkq (2004-12-27 10:30) [6]Сработало без ошибок, но после выполнения переменная S оказалась пустой. Очевидно, то, что попало из файла в память содержит #0, то интерпретируется, как конец. А вот до метода Read там были пустые данные. А без PCharа нельзя? Или как обойти этот #0?
← →
Плохиш © (2004-12-27 10:41) [7]array of byte
← →
Рамиль © (2004-12-27 10:45) [8]s[i] считает, потеряется до #0 если копировать присвоением в другую строку.
Или как
Плохиш © (27.12.04 10:41) [7]
← →
Pavelkq (2004-12-27 12:14) [9]Ура, получилось и то и другое! Просто если просить вывести переменную S, как string, она выводит пустоту, т.к. не успев начаться заканчивается. А если в цикле выводить по одному символу, то там все на месте!
Кстати, с байтом тоже все проходит на ура!
Спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.048 c