Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с динамическими массивами, и файлами 
:(
    Опции темы
NiJazz
  Дата 8.2.2004, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Я хочу записать в файл динамический массив, причём состоящий из строк нефиксированной длины. Допустим, я это сделал. Но как потом можно это считать и вывести результат?
Код

procedure TForm1.Button1Click(Sender: TObject);
var hFile: integer;
   buf: array of string;
   Size: cardinal;
begin
hFile := FileOpen('C:\myfile.txt', fmOpenWrite);
SetLength(buf, 3);
buf[0] := 'My ';
buf[1] := 'name ';
buf[2] := 'is';
FileWrite(hFile, buf, 11); // Но хотелось бы измерять размер тоже программно (другой пост)
buf := nil;
FileClose(hFile);
end;

Вот мы записали в файл. Потом нужно считать подобным образом.

Размер buf при считывании можно узнать через размер файла. А его размерность?

PM MAIL   Вверх
Paradox
Дата 8.2.2004, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Можно после каждой строки дописывать в файл некоторый служебный символ - потом считывать из файла до него, после этого считывания увеличивать размерность buf на 1 и читать в следующий элемент


--------------------
---
PM MAIL WWW   Вверх
<Spawn>
Дата 8.2.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Если не хочется думать о спсобе записи\загрузки, то проще воспользоваться TStringList:

Код

 List := TStringList.Create;
 try
   List.Add('My ');
   List.Add('name ');
   List.Add('is');
   List.SaveToFile('C:\...');
 finally
   FreeAndNil(List);
 end;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 8.2.2004, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Если же хочется самому, то примерно так:

Код
const
 DELIMITER = #13;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TDynArray = array of string;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure FillDynArray(var DynArray: TDynArray; Params: array of string);
var
 i: integer;
begin
 SetLength(DynArray, Length(Params));
 for i := 0 to High(Params) do
   DynArray[i] := Params[i] + DELIMITER;
end;

procedure ExtractStrings(var buf: TDynArray; TempStr: string);
var
 i, StringsCounter: integer;
begin
 StringsCounter := 0;
 repeat
   i := Pos(DELIMITER, TempStr);
   if i <> 0 then
   begin
     Inc(StringsCounter);
     SetLength(buf, StringsCounter);
     SetLength(buf[StringsCounter - 1], i - 1);
     buf[StringsCounter - 1] := Copy(TempStr, 1, i - 1);
     Delete(TempStr, 1, i);
   end;
 until i = 0;
end;

procedure ReadDynArray(var buf: TDynArray; hFile: THandle);
var
 Size: DWORD;
 TempBuf: string;
begin
 Size := GetFileSize(hFile, nil);
 SetLength(TempBuf, Size);
 FileRead(hFile, TempBuf[1], Size);
 ExtractStrings(buf, TempBuf);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 hFile: THandle;
 buf: TDynArray;
 Size: Cardinal;
 i: integer;
begin
 hFile := FileOpen('C:\myfile.txt', fmOpenWrite);
 FillDynArray(buf, ['My ', 'name ', 'is']);
 for i := 0 to High(buf) do
   FileWrite(hFile, buf[i][1], Length(buf[i]));
 SetLength(buf, 0);
 FileClose(hFile);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 buf: TDynArray;
 hFile: THandle;
 i: integer;
begin
 hFile := FileOpen('C:\myfile.txt', fmOpenRead);
 ReadDynArray(buf, hFile);
 for i := 0 to High(buf) do
   ShowMessage(buf[i]);
 FileClose(hFile);
end;


Это сообщение отредактировал(а) <Spawn> - 8.2.2004, 08:47


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
NiJazz
Дата 8.2.2004, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



<Spawn>
Спасибо огромное!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.