Форум: "Начинающим";
Текущий архив: 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