Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с txt в C++Builder  (Прочитано 26050 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Sergius
Интересующийся

ru
Offline Offline

« : 15-06-2011 10:43 » 

Моя програмка)
Она выбирает фал *.pdf  и считает сколько там страниц. То есть если открыть файл в текстовом документе то можно найти там
Код:
3 0 obj
<<
   /Type /Page
   /Parent 2 0 R
   /Resources <<
   /ProcSet [/PDF /Text ]
   /Font <<
   /F1 6 0 R
   /F2 9 0 R
>>
>>
   /MediaBox [0 0 595 842]
   /Contents 4 0 R
>>
endobj
Я как раз и считаю сколько раз встретится элемент (слово) Page
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if (OpenDialog1->Execute())
   {
      LoadPdfFile(OpenDialog1->FileName);
      CreateXMLFile(OpenDialog1->FileName);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadPdfFile(AnsiString filename)
{
   TStringList *pdf = new TStringList;
   AnsiString pdf_file = filename;
 
   pdf->LoadFromFile(pdf_file);
 
   int i, j;
   for (i; i<pdf->Count; i++)
   {
    if (pdf->Strings[i].Pos("/Page"))
    {
    j++;
    }
   }
   MessageDlg("Документ содержит " + IntToStr(j) + " страниц", mtInformation, TMsgDlgButtons() << mbOK, 0);
   delete pdf;
}
Только проблема в том что он считает еще похожие слова типа Pages или PageMode. Помогите исправить что бы он вносил в счетчик если после Page стоит переход на другую строку или пробел
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-06-2011 13:02 » 

Sergius, а твои предложения?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #2 : 15-06-2011 13:58 » 

к сожалению отсутствуют, я только смог добиться этого, так как не силен в программировании Жаль... пока Ага
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-06-2011 14:08 » 

Sergius, что это такое?

Код:
if (pdf->Strings[i].Pos("/Page"))

Как это работает?
« Последнее редактирование: 15-06-2011 15:57 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #4 : 15-06-2011 14:13 » new

Цитата
Как это работает?
Задается условие, поиск вхождений в строку текста "/Page"
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 15-06-2011 15:53 » 

Sergius, нет, функция Pos делает не это - см. документацию. Из ответа на этот вопрос прямо следует решение твоей задачи.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #6 : 15-06-2011 17:31 » 

А может какую нибудь подсказаньку дадите, очень срочно нужно сдать прогу(

Добавлено через 1 минуту и 22 секунды:
и смотрел я много учебников, трудно разобраться, не могу понять что для решения моей задачи подойдет
« Последнее редактирование: 15-06-2011 17:32 от Sergius » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 15-06-2011 20:12 » 

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

А вообще, я бы обратился к регулярным выражениям.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-06-2011 07:21 » 

Цитата: Sergius
очень срочно нужно сдать прогу(
Из этого ответа следует, что программу ты не написал, а списал по крайней мере кусочно, а то и вовсе взял чужое решение.

Цитата: Sergius
смотрел я много учебников, трудно разобраться, не могу понять что для решения моей задачи подойдет
Сначала надо понять задачу, а не методом тыка подбирать ответы. "Смотрение многих учебников" сочувствия не вызывает. Старинная поговорка гласит: "Смотришь в книгу - видишь фигу." В литературе тоже случай описывается: "Ты ж хоть лоб себе разбей, так не выбьешь двух рублей." И вообще никакая бурная деятельность не заменяет отсутствия мысли. "Многие готовы скорее умереть, чем подумать." (Бертран Рассел)

Цитата: RXL
А вообще, я бы обратился к регулярным выражениям.
Само собой, но данное конкретное решение с помощью Pos получается длиной в два действия, причём одно из них уже написано, только автор темы сам не понимает, что там написано. Лечим.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #9 : 16-06-2011 07:48 » 

Цитата
Как это работает?
int __fastcall Pos(const AnsiString& subStr) const;
Возвращает индекс первого символа первого вхождения subStr в S1. Индексы начинаются с 1. Если subStr не содержится в S1, возвращается 0.

Все равно не понимаю
« Последнее редактирование: 16-06-2011 07:51 от Sergius » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 16-06-2011 08:56 » 

Sergius, от тебя не ждут, что ты скопипстишь хелп, а хотя бы его разочек прочитаешь. Собственно вопрос направлен на выяснение, а понимаешь ли ты, что делает эта ф-я.

Теперь ещё раз, своими словами. Как ты понял, что она делает? Ибо именно от этого зависит, её использование.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-06-2011 09:19 » 

Sergius, что такое "индекс первого символа"? Своими словами. О чём тут речь?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #12 : 16-06-2011 09:49 » 

Функция Pos находит первое вхождение строки "/Page" в строках документа и возвращает индекс первого символа. Индекс первого символа это 1. Т.е. индекс символа это его порядковый номер
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 16-06-2011 12:28 » 

Sergius, логика, конечно, странноватая, но вывод верный. Pos возвращает порядковый номер символа в строке. Вот только сомнения меня терзают... У тебя есть 2 строки: искомая и та, где происходит поиск. О каком символе из какой строки и о каком порядковом номере этого символа в какой строке идёт речь?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #14 : 16-06-2011 13:12 » 

Запутался... Речь идет о порядковом номере символа "/" при вхождении искомой строки, в ту где происходит поиск
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 16-06-2011 13:42 » 

Sergius, да, Pos возвращает позицию в строке, где начинается искомая подстрока (или 0, если не найдено).

Ты пожаловался, что твой вариант не работает, если сразу после искомой подстроки стоит символ, отличный от разделителя (пробела, перевода строки, табуляции и т.п.).

Как проверить, какой символ находится в этом проблемном месте?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #16 : 16-06-2011 14:33 » 

Как проверить, какой символ находится в этом проблемном месте?
Код:
if (pdf->Strings[i].Pos("/Page")+5="")
только не работает
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 16-06-2011 16:02 » 

Sergius, потому что синтаксиса не понимаешь. Pos+5 будет номер позиции в строке - почему номер символа сравнивается со строкой, да ещё и пустой?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #18 : 16-06-2011 17:18 » 

Я не знаю, при чтении литературы я ни где не встречал подробного описания использования функции Pos
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 16-06-2011 17:45 » 

Sergius, это не может быть описано в литературе. Это обычный здравый смысл + понимание синтаксиса.

Я могу разложить это на цепочку уточняющих вопросов?

1) Что такое pdf?
2) Что такое pdf->Strings? Что здесь делается?
3) Что такое pdf->Strings[ i ]? Что здесь делается?
4) Что такое pdf->Strings[ i ].Pos("/Page") - ты уже ответил.
5) Что такое pdf->Strings[ i ].Pos("/Page")+5? Что делается, с какой целью?
6) Что такое pdf->Strings[ i ].Pos("/Page")+5=""? Что делается, с какой целью? Скорее всего, здесь ошибка.
7) Что такое if(pdf->Strings[ i ].Pos("/Page")+5="")?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergius
Интересующийся

ru
Offline Offline

« Ответ #20 : 16-06-2011 18:14 » 

1) строковый список
2) обращение к строкам
3) тоже самое что и 2, обращение к строкам
4) возвращает позицию в строке, где начинается искомая подстрока "/Page"
5) к позиции, где начинается искомая строка прибавляется 5, т.е. обращение не к "/", а к "e". Видимо надо чтобы было +6
6) Проверка, что после 6 символа будет стоять пробел
7) Задается условие в цикле for
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 16-06-2011 18:25 » 

2. TStringList::Strings - не строки, а индексируемое свойство коллекции. Без индекса его применять не получится - даже не скомпилируется. (property - это борландовское расширение языка).

3. Разве?

5. Неверно.

6. Бред. Причем двойной.

7. Аналогично 6.


Вывод:
1. Языка не занаешь.
2. Встроенный в BCB мануал не читаешь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sergius
Интересующийся

ru
Offline Offline

« Ответ #22 : 16-06-2011 18:39 » 

Вывод
Я знаю, что я не знаю языка, если бы знал не просил бы помощи у знающих людей
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 16-06-2011 18:44 » 

Ну так почитай. У тебя явно виден пробел в операторах и понимании типов данных.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sergius
Интересующийся

ru
Offline Offline

« Ответ #24 : 17-06-2011 06:58 » 

На этом оказание мне помощи окончено?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 17-06-2011 07:05 » 

Sergius, тебе неоднократно указывают на непонимание языка.
Ты пытаешься играть в угадайку, и не сопоставляешь тебе сказанное с тобой написанным.

строка

аааБББааа

ищем ББ

скажи, функция pos какой результат вернет?

Добавлено через 3 минуты и 3 секунды:
в некоторых  редакторах есть функция поиска и можно поставить "галочку" искать только целые слова.

Как это по твоему происходит?

Расскажи словами.
« Последнее редактирование: 17-06-2011 07:08 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sergius
Интересующийся

ru
Offline Offline

« Ответ #26 : 17-06-2011 07:45 » 

Функция вернет 4
Мне надо проверить будет ли 6 символ пробелом или переходом на другую строку
Я понимаю логику, но не знаю языка, как это написать
« Последнее редактирование: 17-06-2011 07:48 от Sergius » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 17-06-2011 07:47 » 

1) и 2) - ну пусть так.

Цитата: Sergius
2) обращение к строкам
3) тоже самое что и 2, обращение к строкам
Если нет разницы, зачем так пишут? В том-то и дело, что разница есть - в языках программирования каждый значок имеет определённый смысл.

4) и 5) - да.

6)

Во-первых,
Цитата: Sergius
Видимо надо чтобы было +6
это семантическая ошибка (баг). А там есть синтаксическая ошибка - вместо нужной по смыслу операции задана совершенно другая, так что компилятор должен отказываться собирать решение и сообщать об этой ошибке.

Во-вторых, я там не вижу пробела.

В-третьих, ты сам сказал, что на 5-м шаге определяется позиция, а тут говоришь, что сравниваются символы. С чего это компилятор об этом догадается? Даже люди телепатией не обладают, а уж машины - тем более.

7) Да, но смысл этого условия? Ответ должен быть развёрнутым, иначе бесполезно.
« Последнее редактирование: 17-06-2011 07:51 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 17-06-2011 07:48 » 

Sergius, ну... а дальше... словами расскажи... ты определил начало подстроки, что ты будешь делать дальше?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 17-06-2011 08:34 » 

Sergius, посмотри в словаре, что означает слово "помощь". Мы тебе помогаем понять, но не думать за тебя, а уж подавно и делать за тебя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines