Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

Чтение файла 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.057 c
3-1212133591
MV
2008-05-30 11:46
2008.12.21
TcxDBLoockupComboBox


2-1226570443
Morgan128
2008-11-13 13:00
2008.12.21
Чтение файла txt


8-1188408194
chipper
2007-08-29 21:23
2008.12.21
Реализация лимба виртуального прибора


15-1224833606
matt
2008-10-24 11:33
2008.12.21
Ищу работу


2-1226208105
Maksim
2008-11-09 08:21
2008.12.21
Как в поле memo1 вставить картинку?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский