Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Записи в массиве


NikolayGavrilovM ©   (2007-09-08 11:30:00) 

У меня есть запись

TExmpl = record
 Id1, Id2: LongWord;
 Name1, Name2: string;
 Types: Word;
 TI: Real;
end;


и их массив

recarray: array of TExmpl;

И есть текстовый файл/Stream/StringStream/StringList, такого формата:

1 //id1
2 //id2
test1  //name1
test2 //name2
5 //Types
777 //TI
2 //id1 -- начало второй записи
5
test3
test4
90
8373


В формате выше для примера представлено две таких записи. В качестве разделителя используется перенос на новую строку.
И вопрос такой: Как наиболее быстро и корректно заполнить мой массив, прочитав из текстового файла/strStream/StrList данные?


Anatoly Podgoretsky   (2007-09-08 13:42:00) [1]

> Palladin  (08.09.2007 13:26:06)  [6]

Только у cardinal у Борланда вечные недоработки, как это было ранее, так и осталось.
Тогда задам вопрос по другому, а зачем автору нужно такое гигантское беззнаковое, думаю, что он просто не подумал, а не от нужды, может ему и половины диапазона хватит, с гарантией работы в любой версии.

Извиняюсь и в предыдущем ответе немного не подумал, спутал с 64 битами.
Но с LongWord все равно проблемы имеют место, зависят от версии.

Задача как всегда осталась за кадром, вместо объяснения задачи видим типовой вопрос, как решить те или иные кривые или нет представления.


Anatoly Podgoretsky   (2007-09-08 13:42:00) [2]

> Palladin  (08.09.2007 13:28:07)  [7]

Я уже извинился, перепутал с 64 битами.


Anatoly Podgoretsky   (2007-09-08 13:36:00) [3]

> Palladin  (08.09.2007 13:22:05)  [5]

с val не пробовал, а справка не дает ответа на этот вопрос.
Надо написать тестовую программу, где на вход подать значение выше Int64
Мне лень, пусть автор проверит.
С Cardinal типа у Борланда всегда заморочка, из версии в версию.


Palladin   (2007-09-08 13:28:00) [4]

да и readln прекрасно справляется с LongWord


Palladin   (2007-09-08 13:26:00) [5]


> Anatoly Podgoretsky ©   (08.09.07 13:16) [4]

интересно зачем человеку знаковое целое если нужно беззнаковое? они (LongWord и LongInt) оба заявлены как фундаментальные


Palladin   (2007-09-08 13:22:00) [6]


> Не знаю как вообще можно строку преобразовать в LongWord

очень просто, с помощью val


Anatoly Podgoretsky   (2007-09-08 13:16:00) [7]

Кроме LongWord наблюдается еще и generic тип Real
Тут надо с нуля переписывать программу, начиная со структуры
TExmpl = record
  Id1, Id2: LongInt;
  Name1, Name2: string;
  Types: Word;
  TI: Double;
end;

Ну а после этого ReadLn или другое будет работать бело и пушисто и переносимо от версии к версии. От Д1 ( и даже TP) до 2007 и далее.


Anatoly Podgoretsky   (2007-09-08 13:12:00) [8]

Какой же нормальный?

function StrToInt(const S: string): Integer;

Не знаю как вообще можно строку преобразовать в LongWord, вроде нет стандартных функций, самому разве рисовать.
Это же будет относиться и к Readln


Palladin   (2007-09-08 11:47:00) [9]

Это нормальный код. Только можно сократить.

r: Integer

AssignFile(myFile, 'datas.txt'); Reset(myFile);
while not Eof(myFile) do
begin
  SetLength(recarray, Length(recarray) + 1);
  with recarray[r] do
  begin
    ReadLn(myFile, Id1);
    ReadLn(myFile, Id2);
    ReadLn(myFile, Name1);
...... и т.д.
  end;
  Inc(r);
end;

CloseFile(myFile);


ps: не рекомендую давать имя text идентификатору


NikolayGavrilovM   (2007-09-08 11:37:00) [10]

Забыл добавить, вот попытался написать чтение из текстового файла построчно, но мне кажется, это плохой код.

r: Integer
text: string;

 AssignFile(myFile, 'datas.txt');
 Reset(myFile);
 while not Eof(myFile) do
 begin
   SetLength(recarray, Length(recarray) + 1);
   with recarray[r] do
   begin
     ReadLn(myFile, text);
     Id1 := StrToInt(text);
     ReadLn(myFile, text);
     Id2 := StrToInt(text);
     ReadLn(myFile, text);
     name1 := text;
...... и т.д.
   end;
   Inc(r);
 end;

 CloseFile(myFile);


Наверх

Титульная страница Поиск, карта сайта Написать письмо