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

Вниз

Записи в массиве   Найти похожие ветки 

 
NikolayGavrilovM   (2007-09-08 11:30) [0]

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

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 данные?


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

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

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);


 
Palladin ©   (2007-09-08 11:47) [2]

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

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 идентификатору


 
Anatoly Podgoretsky ©   (2007-09-08 13:12) [3]

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

function StrToInt(const S: string): Integer;

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


 
Anatoly Podgoretsky ©   (2007-09-08 13:16) [4]

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

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


 
Palladin ©   (2007-09-08 13:22) [5]


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

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


 
Palladin ©   (2007-09-08 13:26) [6]


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

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


 
Palladin ©   (2007-09-08 13:28) [7]

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


 
Anatoly Podgoretsky ©   (2007-09-08 13:36) [8]

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

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


 
Anatoly Podgoretsky ©   (2007-09-08 13:42) [9]

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

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

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

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


 
Anatoly Podgoretsky ©   (2007-09-08 13:42) [10]

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
6-1171007451
inex
2007-02-09 10:50
2007.10.07
работа с IdFTP


2-1189500997
RomanH
2007-09-11 12:56
2007.10.07
Бвстрая замена символа на символ


2-1189150890
AlexGryb
2007-09-07 11:41
2007.10.07
Панэль задач


2-1189493063
tomkat
2007-09-11 10:44
2007.10.07
поиск подкаталогов


4-1175630984
LuceferAB
2007-04-04 00:09
2007.10.07
как показать форму не отбирая фокуса