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

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

Чтение файла txt [D7, WinXP]


Страницы:   1 2

Morgan128 ©   (2008-11-13 13:00:00) 

Добрый день.
Дано: Есть текстовый файл с кучей строк, в каждой строке записаны цифры, разделённые символами ', ' (запятая и пробел).
Вопрос: как в цикле считать цифры до запятой, потом пропустить два символа (запятая и пробел) и считать следующие цифры до след. запятой... и т.д.?


Morgan128   (2008-11-13 15:59:00) [21]

Кусок файла:
205, 199, 193, 178, 163, 156, 140, 133, 123, 111, 99, 92, 85,
146, 138, 133, 121, 109, 101, 95, 91, 86, 81, 79, 82, 85,
100, 96, 94, 91, 88, 87, 83, 84, 85, 85, 84, 83, 82, 81,
Каждая цифра - яркость пикселя, соответствует рисунку. Количество значений в строке одинаковое, но как видите цифры разные. Разделение никак не убрать.
Куча... ну представте себе изображение 640х480. Это примерно 307200 пикселей. Вот такая куча. А если изображение больше...
Цикл... ну не знаю я, может еще как это все можно обработать :) можно так, но это ведь и есть цикл:

for y:=0 to Bitmap.Height do
 begin
   for x:=0 to Bitmap.Width do
   begin
     // обработка данных
   end;
 end;


Юрий Зотов   (2008-11-13 13:52:00) [22]

Если количество чисел в каждой строке одинаково, то самое простое - это убрать запятые (поскольку не нужны) и читать обычными Read/ReadLn в двойном цикле из тестового файла. Что-то типа этого:

type
 TRow = array[1..N] of integer;
 TArr = array of TRow;

var
 Arr: TArr;

i := 0;
while not EoF(F) do
begin
 Inc(i);
 SetLength(Arr, i);
 for j := 1 to N do
   Read(F, Arr[i-1][j]);
 if not EoF(F) then
   ReadLn(F)
end;


А если количество чисел в каждой строке разное, то можно сделать так же, но чуть сложнее:

type
 TRow = array of integer;
 TArr = array of TRow;

var
 Arr: TArr;

i := 0;
while not EoF(F) do
begin
 Inc(i);
 SetLength(Arr, i);
 j := 0;
 while not EoL(F) do
 begin
   Inc(j);
   SetLength(Arr[i-1], j);
   Read(F, Arr[i-1][j-1])
 end;
 if not EoF(F) then
   ReadLn(F)
end;

Недостаток такого кода - многократное перераспределение памяти, но если файл не огромный, то это не страшно. Кстати, если в начало файла записать количество строк в нем, а в начало каждой строки записать количестов чисел в ней, то и многократного перераспределения памяти можно избежать (читаем число и сразу ставим SetLength, не в цикле).


Anatoly Podgoretsky   (2008-11-13 13:21:00) [23]

> Anatoly Podgoretsky  (13.11.2008 13:17:02)  [2]

Или CommaText, возможны артефакты


Anatoly Podgoretsky   (2008-11-13 13:17:00) [24]

> Morgan128  (13.11.2008 13:00:00)  [0]

StringReplace+StringList


Сергей М.   (2008-11-13 13:02:00) [25]

Велика ли "куча" ?
И обязателен ли цикл ?


Страницы:   1 2

Наверх

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