Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.047 c
15-1189256604
Галинка
2007-09-08 17:03
2007.10.07
Переполнение буфера/кучи


2-1189170412
Arm79
2007-09-07 17:06
2007.10.07
ScreenToClient - отрицательные отрицательные значения Point.Y


4-1175969967
AGGRESSOR
2007-04-07 22:19
2007.10.07
GUI (redirect output from console application)


15-1187848276
AZIZE
2007-08-23 09:51
2007.10.07
И снова о кино


15-1189306522
Aller
2007-09-09 06:55
2007.10.07
виста + хп





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский