![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение файла txt [D7, WinXP]
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]Велика ли "куча" ?
И обязателен ли цикл ?