Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 839
от 03.09.2007, 23:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 501, Экспертов: 67
В номере:Вопросов: 5, Ответов: 10


Вопрос № 100085: Здравствуйте уважаемые эксперты. Возникла такая проблема: программа копирует текстовый файл по строкам; когда в строке имеется символ процента (%), то выдается ошибка выполнения; существуют комбинации вида: %s, %d и т.д. для вывода др...
Вопрос № 100105: Доброго времени суток. Как можно получить вывод запущеной программы. Т.е. из своей программы запускаю некоторую консольную утилитку, ее вывод (в т.ч. и ошибок) хотелось бы получить. Разработка ведеться в С++Builder 6. Пока нашел ...
Вопрос № 100129: Здравствуйте эксперты! Помогите реализовать следующее:Есть пароль с плавающим количеством символов (длина изменяется от n до m). Необходимо организовать подбор пароля с помощью циклов и возможностью приостановки перебора и дальнейшего возобн...
Вопрос № 100150: Уважаемые эксперты, объясните почему не работает программа....
Вопрос № 100156: Доброе время суток эксперты! Пишу в BDS 2006. Возник такой вопрос: Как мне объявит переменную Ansistring appname; в юните главной формы или самой программы так, чтобы эта переменная была досупна из любого другого юнита?...

Вопрос № 100.085
Здравствуйте уважаемые эксперты.
Возникла такая проблема:
программа копирует текстовый файл по строкам;
когда в строке имеется символ процента (%), то выдается ошибка выполнения;
существуют комбинации вида: %s, %d и т.д. для вывода дробных чисел или чего-то подобного.
Но почему программа сама распознает %, как начало такой комбинации? (для эксперемента в текст файла было добавлено и - НИЧЕГО, скопировалось как есть).
Заранее благодарю за ответ.

Приложение:

Отправлен: 29.08.2007, 10:27
Вопрос задал: Лис Иван (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Баранов Владимир aka C4tnt
Здравствуйте, Lisivan!

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

К сожалению в вашем исходнике не указан способ получения переменных fLength и StrLength
Если они вычисляются какой-либо функцией - стоит проверить её реакцию на знаки %
Попробуйте копировать следующим образом:

CString str="";
while(File.ReadString(str) != NULL){ //читаем строки поочерёдно и проверяем, прочиталось ли что-нибудь
NewFile.WriteString(str);//записываем новый файл
CString str="";
}

Если этот кусочек кода также не будет копировать файлы с % то, видимо, дело действительно в компиляторе. По крайней мере точно могу сказать, что в MSDN за 2005 год сказано, что данные функции читают и пишут строки как есть (без подстановок).
---------
Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: Баранов Владимир aka C4tnt (статус: 4-ый класс)
Ответ отправлен: 29.08.2007, 11:50

Отвечает: Aristos
Здравствуйте, Lisivan!

После внесения некоторых исправлений код стал работать. Никаких проблем при считывании %. Эти функции не реагируют на присутствие подобных символов, они тупо считывают содержимое файла (текстового) до символа перевода строки.

ps: Программа не будет копировать символы перевода строки, т.к. ReadString считывает строку не включая символ перевода строки, а WriteString этого символа не добавляет.

pps: Проверка в цикле будет работать корректно, только если файл состоит из ANSI символов, а строка переводится двумя символами ( ). Лучше сделать проверку:
File.GetPosition() < File.GetLength()

Приложение:

Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 29.08.2007, 14:03


Вопрос № 100.105
Доброго времени суток.
Как можно получить вывод запущеной программы.
Т.е. из своей программы запускаю некоторую консольную утилитку, ее вывод (в т.ч. и ошибок) хотелось бы получить.

Разработка ведеться в С++Builder 6.
Пока нашел только решение ч-з промежуточный файл, т.е. перенаправляем вывод коносльного приложения в файл и потом его читаем. Но такой вариант мне не нравиться.
Отправлен: 29.08.2007, 13:14
Вопрос задал: Lemeshev Konstantin (статус: 5-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Jadd
Здравствуйте, Lemeshev Konstantin!
Для таких целей существует механизм каналов или пайпов (Pipes). Поищите на портале, тут уже были ответы как сделать перенаправление ввода-вывода в пайпы, в том числе мой ответ и пример на С++.

Успехов.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал)
Адрес: Санкт-Петербург
WWW: http://www.sport-diary.ru
----
Ответ отправлен: 29.08.2007, 13:27
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, еще бы ссылочку :-)

Отвечает: Aristos
Здравствуйте, Lemeshev Konstantin!

Можно сделать так. Перед вызовом консольного приложения (например с помошью CreateProcess) создать консоль (AllocConsole). После этого весь вывод консольной программы пойдет в эту созданную консоль. Соответственно можно получить её содержимое с помошью функций WinAPI для работы с консолью (ReadConsole, например).

Для проверки можно сделать следущее. Понадобиться дебагер, для удобства. В некоторое место программы добавляем следующий код:

// создаем консоль, тут же её можно настроить
AllocConsole();

// создаем поток
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(NULL, TEXT("test.exe"), NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
// ожидаем окончание выполнение потока
WaitForSingleObject(pi.hProcess, INFINITE);

// !!!если поставить точку останова на следующей строке, то когда на ней
// окажется дебагер - будет висеть консольное окно с выводом запущенной программы
FreeConsole();

Текст тестовой программы в приложении.
До вызова FreeConsole можно прочитать содержимое консоли и т.д.

Приложение:

Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 29.08.2007, 14:43


Вопрос № 100.129
Здравствуйте эксперты! Помогите реализовать следующее:Есть пароль с плавающим количеством символов (длина изменяется от n до m).
Необходимо организовать подбор пароля с помощью циклов
и возможностью приостановки перебора и дальнейшего возобновления перебора.

Приложение:

Отправлен: 29.08.2007, 16:10
Вопрос задал: Сергей Николаевич (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Sergey A. Wedensky
Здравствуйте, Сергей Николаевич!

Ну вот Вам пример реализации. Если проблема, конечно была в организации перебора.
Но учтите, перебор вешь долгая. И зависимость времени от количества символов даже не экспоненциальная, а показательная!
На перебор вариантов, состоящих только из цифр длиной до 10 включительно занял около 7 минут на Core2Duo 6600 @ 2.4GHz. Только перебор всех вариантов, без вывода на экран и проверки правильности.

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 29.08.2007, 19:18

Отвечает: Терсков Сергей
Здравствуйте, Сергей Николаевич!
Вот вариант с перебором всех возможных последовательностей символов из строки symbols. В функции check_password вам нужно реализовать проверку правильности пароля. Пока на месте проверки простой вывод на экран...

Приложение:

Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 30.08.2007, 03:42

Отвечает: Ross
Здравствуйте, Сергей Николаевич!

Возможно более быстрый вариант... =) Но поиск длинных паролей все равно занимает продолжительное время

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 31.08.2007, 15:44


Вопрос № 100.150
Уважаемые эксперты, объясните почему не работает программа.

Приложение:

Отправлен: 29.08.2007, 18:11
Вопрос задал: znr (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Aristos
Здравствуйте, znr!

Ошибка компиляции возникает потому, что переменная Date::default_date объявлена как статическая и поэтому должна быть инициализирована вне объявления класса.

Добавьте после объявления класса Data следующую строку:
Date Date::default_date;
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 29.08.2007, 18:22
Оценка за ответ: 5
Комментарий оценки:
Понятно. Спасибо.


Вопрос № 100.156
Доброе время суток эксперты!
Пишу в BDS 2006.
Возник такой вопрос:
Как мне объявит переменную Ansistring appname; в юните главной формы или самой программы так, чтобы эта переменная была досупна из любого другого юнита?
Отправлен: 29.08.2007, 18:55
Вопрос задал: Уваров Андрей Александрович (статус: Студент)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Aristos
Здравствуйте, Уваров Андрей Александрович!

Вам поможет глоабльная переменная. необходимо определить её в _одном_ из модулей *.cpp вне любой функции или класса:
AnsiString appname;

А в других файлах использующих эту переменную надо объявить её так:
extern AnsiString appname;

Для удобства это (второе) объявление можно моместить в заголовочный *.h файл, подключаемый в остальные.
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 29.08.2007, 19:02
Оценка за ответ: 5
Комментарий оценки:
Спасибо, все получилось.

Отвечает: Shurka
Здравствуйте, Уваров Андрей Александрович!
К сожалению, чтобы увидеть что-то в одном юните, это что-то ДОЛЖНО быть объявлено в интерфейсе другого ЮНИТА, а этот юнит (в котором это что-то объявлено) должен быть прописан в uses того юнита, из которого мы хотим это наше что-то увидеть :-)))
То есть остается один выход. Объявить эту переменную в каком-то юните и подключить его ко всем остальным.
Кстати, чтобы в любой момент получить полное имя приложения, можно вызвать функцию ParamStr(0) (unit System)
Ответ отправил: Shurka (статус: 2-ой класс)
Ответ отправлен: 30.08.2007, 06:54


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.58 от 30.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное