Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > доступ к открытому файлу


Автор: frodo 18.9.2008, 11:19
Добрый день программисты! возникла проблемка в программе написанной на c++ генерируются числа(каждые пол секунды, или меньше) и записываются в файл, так вот нужно в приложении написанном на delphi считывать эти числа и выводить их ну допустим в listbox1
организовал такой код
Код

var
  b: string[155];
begin
  with TFileStream.create('D:\Example\potok\release\file.txt', fmShareDenyNone) do
  try
    read(b,25);
listbox1.Items.Add(b);
  finally
    Free;
  end;

но нужно выводить в listbox полностью весь файл, а он выводит тока 25 символов, максимум ставится 256! вот такой вопросик!

Автор: morpheyushka 18.9.2008, 11:34
Цитата(frodo @  18.9.2008,  11:19 Найти цитируемый пост)
а он выводит тока 25 символов

так у тебя делфийским языком написано
Код

read(b,25);

я бы цикл поставил, но опять таки - как числа заносятся: новое число с новой строчки или через разделитель?

Автор: frodo 18.9.2008, 11:39
Цитата(morpheyushka @ 18.9.2008,  11:34)
я бы цикл поставил, но опять таки - как числа заносятся: новое число с новой строчки или через разделитель?

заносятся с новой строчки!!!а как цикл то, я даже к файлу этому немогу обратиться через while not eof  переменной файла нету

Автор: Данкинг 18.9.2008, 11:49
Цитата(frodo @  18.9.2008,  12:39 Найти цитируемый пост)
переменной файла нету 

А в чём проблема это организовать?

Автор: frodo 18.9.2008, 11:55
Цитата(Данкинг @ 18.9.2008,  11:49)
А в чём проблема это организовать?

если создавать переменную типо f:textfile мне нужно связать ее с файлом assignfile(f,"filename"); а так я сделать несмогу так как файл у меня занят другой программой!!!
или я что то недопонял?

Автор: CodeMonkey 18.9.2008, 11:56
...ставим курсор на TFileStream, жмём F1 и не задаём таких вопросов...

Автор: ama_kid 18.9.2008, 12:01
Цитата(frodo @  18.9.2008,  12:39 Найти цитируемый пост)
а как цикл то, я даже к файлу этому немогу обратиться через while not eof  переменной файла нету 
TFileStream.Seek(0,soFromEnd) вернет текущий размер файла. На этот размер организовывай буфер и считывай за один раз (не забыв перевести указатель на начало)...

Автор: frodo 18.9.2008, 12:02
Цитата(CodeMonkey @ 18.9.2008,  11:56)
...ставим курсор на TFileStream, жмём F1 и не задаём таких вопросов...

после на жатия на F1 
TFileStream enables applications to read from and write to a file on disk.

Unit

Classes

Description

Use TFileStream to access the information in disk files. TFileStream will open a named file and provide methods to read from or write to it. If an application already has a handle to the file, opened in the appropriate mode, use THandleStream instead.


не вы такие умные help поюзал уже, но увы чет не то!

Добавлено через 8 минут
Цитата(ama_kid @ 18.9.2008,  12:01)
TFileStream.Seek(0,soFromEnd) вернет текущий размер файла. На этот размер организовывай буфер и считывай за один раз (не забыв перевести указатель на начало)...

вот ошибочка выходит!
[Error] Unit1.pas(39): This form of method call only allowed for class methods

Автор: CodeMonkey 18.9.2008, 12:30
Цитата(frodo @  18.9.2008,  12:02 Найти цитируемый пост)
после на жатия на F1 

Ну, товарищ! smile 

Для кого наверху ссылки "Properties", "Members"/"Methods"?
Изучайте свойства и методы объекта, если уж не хотите в книжку заглянуть.

По тому же Read можно там прочитать:
Цитата
Use Read to read data from the resource associated with the handle stream when the number of bytes in the file is not known. Read transfers up to Count bytes from the resource, starting at the current position, and then advances the current position in the resource by the number of bytes actually transferred. Read returns the number of bytes actually transferred, which may be less than Count if the end of file marker is encountered.


Хотите в стиле цикла с EOF - используйте всякие Position, Size, Seek.

P.S. Я бы ещё рекомендовал http://www.delphikingdom.ru/lyceum/seminar.asp?id=2

Добавлено через 3 минуты и 2 секунды
Цитата(frodo @  18.9.2008,  12:02 Найти цитируемый пост)
вот ошибочка выходит!

А потому что не надо копировать в лоб, не понимая, что вам говорят. 
На самом деле, вам сказали "используй метод метод Seek", а не "копируй код слово-в-слово".
Seek - метод класса TFileStream. Ну и где у вас объект класса TFileStream? С учётом того, что Read - тоже метод класса TFileStream?

Добавлено через 8 минут и 18 секунд
Цитата(frodo @  18.9.2008,  11:55 Найти цитируемый пост)
если создавать переменную типо f:textfile мне нужно связать ее с файлом assignfile(f,"filename"); а так я сделать несмогу так как файл у меня занят другой программой!!!

Сможете вы открыть файл или нет - зависит от двух факторов:
1). Режима открытия, в котором открыла/создала файл программа, что в него пишет.
2). Режима открытия, с которым пытаетесь открыть файл лично вы. В свою очередь, это зависит:
  а). Для TFileStream - от параметров, передаваемых в конструктор объекта.
  б). Для файлов в стиле Паскаль (AssignFile/Reset и т.п.) - от переменной FileMode. Опять же - смотрите сравку, там всё написано.

Автор: morpheyushka 18.9.2008, 12:42
если сильно хочется через файловые переменные - вот тебе код:
Код

var
  TF: TextFile;
  S: String;
begin
  Form8.KeyPreview := true;
  ListBox1.Clear;
  AssignFile(TF, 'D:\Example\potok\release\file.txt');
  Reset(TF);
  while not EOF(TF) do
    begin
      ReadLn(TF, S);
      ListBox1.Items.Add(S);
    end;
  CloseFile(TF);
end;

Автор: frodo 18.9.2008, 13:01
Всем спасибо!!! организовал по другому!!!! вариант по которому шел оказался слишком замороченным(для меня покрайне мере), нашел более другой способ!

Добавлено через 1 минуту и 43 секунды
Цитата(morpheyushka @ 18.9.2008,  12:42)
если сильно хочется через файловые переменные - вот тебе код:
Код

var
  TF: TextFile;
  S: String;
begin
  Form8.KeyPreview := true;
  ListBox1.Clear;
  AssignFile(TF, 'D:\Example\potok\release\file.txt');
  Reset(TF);
  while not EOF(TF) do
    begin
      ReadLn(TF, S);
      ListBox1.Items.Add(S);
    end;
  CloseFile(TF);
end;

мда читай первое мое сообщение!!!ФАЙЛ ЗАНЯТ другим процессом!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)