Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.057 c
14-1103785132
Архитектор
2004-12-23 09:58
2005.01.16
Стоимость официальной Delphi от Borland-а


1-1104414690
R.O.O.T
2004-12-30 16:51
2005.01.16
Помогите почему происходит следующее


14-1103960552
Поручик
2004-12-25 10:42
2005.01.16
SATA


9-1096173815
Mitay
2004-09-26 08:43
2005.01.16
Как определить частоту звука?


14-1103929672
OneFragLeft
2004-12-25 02:07
2005.01.16
Курс молодого бойца (читать - программиста)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский