![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() такие пироги, подгрузка файла с данными,запись их в двумерный массив, затем вывод всего на StringGrid, но все идет через одно место, кое что набросал но не уверен,массив в файле по идеи 200 на 200, то бишь 40000 значений,но может и меняться,еще хотел попросить помощи в заполнении массива не с начала данных а скажем с 5 строчки.
Код:
var Form1: TForm1; Mass: array of array of real; procedure TForm1.BitBtn1Click(Sender: TObject); var F : textfile; i,j,m,n : integer; begin if OpenDialog1.Execute then AssignFile(f,OpenDialog1.FileName); RESET(F); SetLength(mass,m,n); I:=0 ; j:=0; i := 0; while not Eof(f) do begin Inc(i); SetLength(mass, i + 1); j:= 0; while not Eoln(f) do begin Inc(j); SetLength(mass[i], j + 1); Read(f, mass[i, j]); end; ReadLn(f); end; CloseFile(f); For i:=1 to m-1 do For j:=1 to n-1 do begin StringGrid1.Cells[i,j]:=floattostr(mass[i,j]); end; end; end. |
#2
|
||||
|
||||
![]() Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
![]() Проще кинуть рабочий код, чем описывать, что не так. Вот сравните:
Код:
procedure TForm1.Button1Click(Sender: TObject); var Mass: Array of Array of Real; F: TextFile; m,n: integer; begin if not OpenDialog1.Execute then Exit; AssignFile(F, OpenDialog1.FileName); Reset(F); m := 0; n := 0; SetLength(Mass, m, n); while not Eof(F) do begin m := Length(Mass); SetLength(Mass, m + 1); while not EoLn(F) do begin n := Length(Mass[m]); SetLength(Mass[m], n + 1); Read(F, Mass[m, n]); end; ReadLn(f); end; CloseFile(f); StringGrid1.FixedCols := 0; StringGrid1.FixedRows := 0; StringGrid1.ColCount := 1; StringGrid1.RowCount := Length(Mass); for m := 0 to Length(Mass) - 1 do begin if StringGrid1.ColCount < Length(Mass[m]) then StringGrid1.ColCount := Length(Mass[m]); for n := 0 to Length(Mass[m]) - 1 do StringGrid1.Cells[n, m] := FloatToStr(Mass[m,n]); end; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Qlimax (08.03.2013)
|
#4
|
||||
|
||||
![]() А что касается считывания с 5 строчки файла данных, то просто вызовите ReadLn(f) 5 раз перед началом заполнения массива и все.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
||||
|
||||
![]() Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#6
|
||||
|
||||
![]() Не, так не пойдет, это-же текстовый файл.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
|||
|
|||
![]() да,m и n это размер массива по идеи, в StringGrid хочу подгружать чтобы проверять правильность загрузки массива, меня больше интересует правильно ли он подгружаеться, еще в файле думаю указывать ряд значений, таких как размерность массива, можно ли сделать так чтобы он брал из файла размер массива, т.е. в 1 строчке написано допустим 200 200, он её считывает и создает массив 200 на 200, а со 2 строчки документа начинает заполнять его данными ?
|
#8
|
||||
|
||||
![]() Можно и так, но вообще хранить так данные как они у вас хранятся, очень непрактично. Даже простая операция перехода на нужную позицию данных в файле выглядит стрёмновато. Намного быстрее и эффективнее содать типизированный файл и работать уже с ним. Это и быстрее и удобнее.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
![]() Вот так сойдёт? Если оно ещё надо
![]() Код:
procedure TForm1.Button1Click(Sender: TObject); var F: System.Text; S : TStringList; Line: String; begin if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then with StringGrid1 do try AssignFile(F, OpenDialog1.FileName); FileMode := 0; Reset(F); S := TStringList.Create; ColCount := 2; RowCount := 2; while not EOF(F) do begin ReadLn(F, Line); S.DelimitedText := IntToStr(RowCount-1) + ' ' + Line; ColCount := Max(ColCount, S.Count); Rows[RowCount-1] := S; RowCount := RowCount + 1; end; // while not EOF(F) do finally RowCount := RowCount - 1; S.Free; if TTextRec(F).Mode <> fmClosed then CloseFile(F); end; // try end; // procedure TForm1.Button1Click(Sender: TObject) |
#10
|
|||
|
|||
![]() в принципе надо, но задача маленько поменялась и я сам во всем уже запутался
![]() |
#11
|
||||
|
||||
![]() Так вот же тебе накатал, читает из текстового файла в StringList любой(условно
![]() Последний раз редактировалось BBBCat, 17.03.2013 в 00:07. |
#12
|
||||
|
||||
![]() Вот хорош конечно класс StringList, но когда вам надо обработать большой текстовый файл быстренько, вообще никуда не годится, пока он выделит память, пока считает... Простое доброе решение через ReadLn сделает тоже самое на порядок быстрее, так-что не всегда то что удобно - лучше.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
||||
|
||||
![]() Согласен, у меня есть примеры, когда кода много, но оно всё летает, а если использовать стандартные методы - тормозит. К тому же он сказал, что у него большие объёмы. Но мне показалось, что человек и так слегка теряется, а тут ещё если грузануть его большим кодом - вообще капец. Но по этой теме поступило несколько предложений, пусть выбирает, что ему лучше. Форум же
![]() 4 000 000 значений считывал 15 секунд. Не фонтан. Заявленые 40 000 - моментально. Последний раз редактировалось BBBCat, 15.03.2013 в 00:19. |