Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
9-1096892904
VasyaPupkin
2004-10-04 16:28
2005.01.16
Выделение спрайта


1-1103910603
LedWorm
2004-12-24 20:50
2005.01.16
Два вопроса по работе с файлами


14-1103707677
infom
2004-12-22 12:27
2005.01.16
Играете ли вы на работе в Counter Strike ?


14-1104079041
Юзер
2004-12-26 19:37
2005.01.16
Сколько стоит этот ноут


6-1098890522
CRACKISH
2004-10-27 19:22
2005.01.16
TTcpServer и TTcpServer из вкладки Internet