Вопрос № 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 год сказано, что данные функции читают и пишут строки как есть (без подстановок).
--------- Теперь к нашим ответам осталось лишь найти вопросы
После внесения некоторых исправлений код стал работать. Никаких проблем при считывании %. Эти функции не реагируют на присутствие подобных символов, они тупо считывают содержимое файла (текстового) до символа перевода строки.
ps: Программа не будет копировать символы перевода строки, т.к. ReadString считывает строку не включая символ перевода строки, а WriteString этого символа не добавляет.
pps: Проверка в цикле будет работать корректно, только если файл состоит из ANSI символов, а строка переводится двумя символами (
). Лучше сделать проверку:
File.GetPosition() < File.GetLength()
Приложение:
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 29.08.2007, 14:03
Вопрос № 100.105
Доброго времени суток.
Как можно получить вывод запущеной программы.
Т.е. из своей программы запускаю некоторую консольную утилитку, ее вывод (в т.ч. и ошибок) хотелось бы получить.
Разработка ведеться в С++Builder 6.
Пока нашел только решение ч-з промежуточный файл, т.е. перенаправляем вывод коносльного приложения в файл и потом его читаем. Но такой вариант мне не нравиться.
Отвечает: Jadd
Здравствуйте, Lemeshev Konstantin!
Для таких целей существует механизм каналов или пайпов (Pipes). Поищите на портале, тут уже были ответы как сделать перенаправление ввода-вывода в пайпы, в том числе мой ответ и пример на С++.
Успехов.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Профессионал) Адрес: Санкт-Петербург WWW:http://www.sport-diary.ru ---- Ответ отправлен: 29.08.2007, 13:27 Оценка за ответ: 5 Комментарий оценки: Огромное спасибо, еще бы ссылочку :-)
Можно сделать так. Перед вызовом консольного приложения (например с помошью CreateProcess) создать консоль (AllocConsole). После этого весь вывод консольной программы пойдет в эту созданную консоль. Соответственно можно получить её содержимое с помошью функций WinAPI для работы с консолью (ReadConsole, например).
Для проверки можно сделать следущее. Понадобиться дебагер, для удобства. В некоторое место программы добавляем следующий код:
// создаем консоль, тут же её можно настроить
AllocConsole();
// !!!если поставить точку останова на следующей строке, то когда на ней
// окажется дебагер - будет висеть консольное окно с выводом запущенной программы
FreeConsole();
Текст тестовой программы в приложении.
До вызова FreeConsole можно прочитать содержимое консоли и т.д.
Приложение:
Ответ отправил: Aristos (статус: 5-ый класс)
Ответ отправлен: 29.08.2007, 14:43
Вопрос № 100.129
Здравствуйте эксперты! Помогите реализовать следующее:Есть пароль с плавающим количеством символов (длина изменяется от n до m).
Необходимо организовать подбор пароля с помощью циклов
и возможностью приостановки перебора и дальнейшего возобновления перебора.
Отвечает: 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; в юните главной формы или самой программы так, чтобы эта переменная была досупна из любого другого юнита?
Отвечает: 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