Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение значений в RichEdit'e, Сод. которого считано из бин. файла 
:(
    Опции темы
Alexey91
Дата 6.6.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Здравствуйте!!

В поле RichEdit'a находится содержимое бинарного файла. Файл открыт функцией LoadFromFile (т.е. взял и загрузил в RE какой-нибудь
jpg, или exe). Файл бинарный нужно открывать произвольный, и структуру его знать не обязательно.
Свойство WordWrap=false
Мне нужно выделить все цифры в данном поле.
Соответственно проблема, что не выделяется то, что нужно, неверно находятся позиции SelStart'a.
Хотя если брать файл текстовый, то в нем все находится верно.

Код

   bool isNum(AnsiString &q)
   {
    if(q >= '0' && q <= '9') return true;
    else return false;
   }
 
 /*
    ti - индекс для трех массивов m1,m2,m3
    re_ti - содержит сумму длин всех предыдущих строк
    str_len - длина текущей строки
    row_count - число строк в поле RE
    res - временная строка, в которой возможен посимвольный просмотр
    m1 - массив, содержащий SelStart'ы
    m2 - массив, содержащий SelLength'ы
    m3 - массив, содержащий числа
    isNum(AnsiString) - логическая функция определяет, является ли обозреваемый символ цифрой
*/
 ti=0; re_ti=0; row_count=R->Lines->Count;
 for(i=0; i < row_count; i++)
 {
  str_len=R->Lines->Strings[i].Length();
  res=R->Lines->Strings[i];
  for(j=1; j <= str_len; j++)
  {
   if(isNum(res[j]))
   {
    m3[ti]=""; // очищаем значение
    m1[ti]=j-1+re_ti; // заносим в массив позицию SelStart'a; j-1 потому что позиция SelStar'a начинается с нуля, а индексация в 
// AnsiString'e c 1; re_ti содержит сумма длин всех предыдущих строк
    m2[ti]=1; // у найденного однозначного числа уже длина 1
    m3[ti]+=res[j]; // сохраняем найденное число в массив
 
    j++;
    while(str_len >= j && isNum(res[j])) // идем пока есть цифры
    {
     m3[ti]+=res[j]; // дополняем строку найденными цифрами
     m2[ti]++; // увеличиваем длину найденного значения (используется для SelLength в дальнейшем)
     j++;
    }
 
    ti++;
   }
  }
  re_ti+=str_len+2; // +2 т.к. wordwrap=false
 }
 /////////////////////////////////


Проект 

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  sel.rar 639,72 Kb
PM   Вверх
Alexey91
Дата 6.6.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Хочу дополнить свою трагедию что ли..))
Мне просто непонятно, почему вот этот алгоритм на текстовом файле работает (txt), а на файле изображения (jpg) не работает.
Вот мы открыли жпегу, вывели всякую бяку, но хоть эта и бяка, она тоже из символов.

Да и причем в первой строке жпега позиции SelStart'a правильно определяются, а дальше с уходом вглубь этого мусора уже начинают съезжать.

Может быть дело в управляющих символах, они как-то влияют, хотя я создаю временную строку, в которую копируется i-я строка RE'a

Проходился с отладчиком, сами цифры определяются верно.

В чем может быть дело? Чем может мусор делать этот алгоритм нерабочим?

PM   Вверх
xvr
Дата 7.6.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Проблема тут -
Цитата(Alexey91 @  6.6.2011,  12:14 Найти цитируемый пост)
  re_ti+=str_len+2;
2 - это символы '\r\n', которыми завершаются строки в символьном файле. В бинарном файле строки тоже будут нарезаться по этим символам, но они не обязанны встречаться попарно. Т.е. '\n' тоже сделает новую строку, и вся ваша нумерация съедет.
Не используйте Lines, используйте Text - там будут все символы, включая и переводы строк (такие, как есть в файле, а не такие, какие должны быть у 'хороших' текстовых файлов)


PM MAIL   Вверх
Alexey91
Дата 7.6.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 18.9.2008

Репутация: нет
Всего: нет



Цитата

 '\n' тоже сделает новую строку, и вся ваша нумерация съедет.


А если '\n' будет стоять в середине строки бинарного файла?


PM   Вверх
xvr
Дата 7.6.2011, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Alexey91 @  7.6.2011,  20:30 Найти цитируемый пост)
А если '\n' будет стоять в середине строки бинарного файла?

Значит будет 2 строки  smile 

У бинарного файла строк, как таковых, вообще нет. Так что встает вопрос, как именно RichEdit его нарежет на строки. А резать он его будет по '\n'. А если перед этим стоял '\r' - он будет бесследно удален

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.