Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Чтение файла txt   Найти похожие ветки 

 
Morgan128   (2008-11-13 13:00) [0]

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


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

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


 
Anatoly Podgoretsky ©   (2008-11-13 13:17) [2]

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

StringReplace+StringList


 
Anatoly Podgoretsky ©   (2008-11-13 13:21) [3]

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

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


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

Если количество чисел в каждой строке одинаково, то самое простое - это убрать запятые (поскольку не нужны) и читать обычными 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, не в цикле).


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

Кусок файла:
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 16:00) [6]


> Morgan128   (13.11.08 15:59) [5]


Ты вообще разницу между цифрой и числом понимаешь ?


 
Morgan128   (2008-11-13 16:05) [7]


> как в цикле считать цифры до запятой,

цифры до запятой (от одной до трех) составляют число.
С тем же успехом могу спросить
как в цикле считать число до запятой,
И нефиг меня принимать за дауна.


 
Сергей М. ©   (2008-11-13 16:12) [8]


> С тем же успехом могу спросить


Успех был бы другим, если бы ты сразу сделал такое одолжение)

> 640х480


Не такая уж и большая куча.
Вполне можно загрузить ее в StringList, а затем для каждого элемента списка выполнить [2]


 
Anatoly Podgoretsky ©   (2008-11-13 16:16) [9]

> Morgan128  (13.11.2008 15:59:05)  [5]

Ну и зачем тут текстовый файл?


 
Morgan128   (2008-11-13 16:19) [10]

1. а если 1200х1024? StringList поможет?
2. Мне эти данные нужны и не раз. Массив все время под них держать?


 
Сергей М. ©   (2008-11-13 16:23) [11]


> если 1200х1024? StringList поможет?


Для считывания и врем.хранения обрабатываемых строк от stringlist"а лучше будет отказаться в пользу построчного считывания (см. [4])

А для разбора каждой прочитанной строки вполне пойдет и [2] и [4]


 
Morgan128   (2008-11-13 16:30) [12]

Либо я туплю, либо 5 лет назад объясняли доступнее.
[4] ведь предлагается удалить разделение запятыми. Как тогда выбрать между числом 123 и числом 45 если будет читаться как 12345?
[2] краткость - сестра таланта.
Придется как-то по другому решать проблему, так как реальной подсказки в решении задачи не вижу.
Спасибо за участие.


 
Anatoly Podgoretsky ©   (2008-11-13 16:34) [13]

> Morgan128  (13.11.2008 16:30:12)  [12]

Ты, у тебя разделение не запятыми, а запятой и пробелом. Если убрать хапятую, то 12345 ну никак не получится.


 
Германн ©   (2008-11-13 16:35) [14]


> Либо я туплю, либо 5 лет назад объясняли доступнее.
> [4] ведь предлагается удалить разделение запятыми. Как тогда
> выбрать между числом 123 и числом 45 если будет читаться
> как 12345?

Точно тупишь. Запятые удалишь, но пробелы то останутся.


 
Morgan128   (2008-11-13 16:35) [15]

и что?
КАК СЧИТАТЬ ДО ПРОБЕЛА???


 
Сергей М. ©   (2008-11-13 16:36) [16]


> Morgan128   (13.11.08 16:30) [12]


> [4] ведь предлагается удалить разделение запятыми


[4] упомянут лишь в части образца построчного чтения, а не обработки прочитанных строк


> Как тогда выбрать между числом 123 и числом 45 если будет
> читаться как 12345?


А вот в этой части как раз и упомянут [2]

Что тебе там не понятно ?


 
Сергей М. ©   (2008-11-13 16:38) [17]


> Morgan128   (13.11.08 16:35) [15]


Ты откровенно тупишь)
Тебе в [2] был намек на возможность воспользоваться встроенными возможностями TStringList для разбиения строки, а ты до сих пор не сделал в эту сторону ни лжного телодвижения.


 
Германн ©   (2008-11-13 16:41) [18]


> Morgan128   (13.11.08 16:35) [15]
>
> и что?
> КАК СЧИТАТЬ ДО ПРОБЕЛА???
>

Ну тогда
> Придется как-то по другому решать проблему, так как реальной
> подсказки в решении задачи не вижу.
> Спасибо за участие.
>


 
Morgan128   (2008-11-13 16:42) [19]

как я сделаю какое-то движение, если у меня в делфе нет хелпа? Тупа забью StringReplace и буду любоваться?
Был бы хелп, меня на этом форуме еще лет 5 никто бы не видел.


 
Anatoly Podgoretsky ©   (2008-11-13 16:48) [20]

> Morgan128  (13.11.2008 16:42:19)  [19]

Тогда ты не делом занимаешь.
Срочно отложить другие дела и поставить справку.
И лучше CommaText


 
sniknik ©   (2008-11-13 16:54) [21]

> если у меня в делфе нет хелпа?
давно уже предлагал, за такие высказывания просто закрывать ветки.
т.к. автор попросту мозг всем парит... а это один из показателей.

> Срочно отложить другие дела и поставить справку.
а как же тогда клевые отмазки для "выдавливания" кода из упрямых мастеров?


 
Сергей М. ©   (2008-11-13 16:56) [22]


> у меня в делфе нет хелпа


Спасибо за очередное одолжение - к 19-му посту мы наконец-то начинаем узнавать тщательно скрываемые тобой тайные подробности)


> Был бы хелп


Что, и Гугль молчит ?!


> Тупа забью StringReplace и буду любоваться?


После StringReplace тупо открываешь скобку и тупо любуешься именами формальных параметров, по которым тупо догадываешься об их назначении.


 
Плохиш ©   (2008-11-13 17:42) [23]

А после

> Morgan128   (13.11.08 16:30) [12]
> Либо я туплю, либо 5 лет назад объясняли доступнее.

он мне начал нравиться 5 лет и ничему не научился
Но после

> Morgan128   (13.11.08 16:42) [19]
> как я сделаю какое-то движение, если у меня в делфе нет
> хелпа?

не могу согласиться с его просьбой

> И нефиг меня принимать за дауна.


 
Юрий Зотов ©   (2008-11-13 18:04) [24]

Morgan128   (13.11.08 16:05) [7]

> как в цикле считать число до запятой

Хоть до запятой, хоть до пробела, хоть до чего угодно еще:

var
 Ch: char;
 Result: cardinal;
============
 Result := 0;
 Ch := "0";
 while Ch in ["0".."9"] do
 begin
   Result := Result * 10 + Ord(Ch) - Ord("0");
   Читаем Ch;
 end;

> И нефиг меня принимать за дауна.

Не даун, конечно, но со знаниями действительно беда. Да и код выше можно было бы придумать самому. Не бином Ньютона.

=============================

А что, разве у Bitmap"а нет готовых методов сохранения в файл и загрузки из файла? Зачем изобретать велосипеды?

Тем более, что попиксельное сохранения Bitmap"а в текстовый файл, да еще и с разделением запятыми - это даже не просто велосипед, а велосипед чудовищный.


 
Сергей М. ©   (2008-11-13 18:37) [25]


> Количество значений в строке одинаковое



> 205, 199, 193, 178, 163, 156, 140, 133, 123, 111, 99, 92, 85, //итого 13
> 146, 138, 133, 121, 109, 101, 95, 91, 86, 81, 79, 82, 85, //тоже 13
> 100, 96, 94, 91, 88, 87, 83, 84, 85, 85, 84, 83, 82, 81, // а здесь 14


Вот как после этого понимать Саида ?)

То у него цифры это числа, то 13 = 14, то справку потерял, то другую предъявил что, мол,  не даун .



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
15-1222772997
Раиса
2008-09-30 15:09
2008.12.21
Хочу найти работу в Санкт-Петербурге


2-1226240731
Fresh
2008-11-09 17:25
2008.12.21
Подлый PaintBox


15-1224058462
matt
2008-10-15 12:14
2008.12.21
Рабочий день


2-1226217609
VitGun
2008-11-09 11:00
2008.12.21
Показ нескольких всплывающих окон


15-1224238625
TUser
2008-10-17 14:17
2008.12.21
Вопрос к геймерам