![]() |
|
Модераторы: bsa |
![]()
|
|
| EvilsInterrupt |
|
||||||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Основная задача, которую хочу решить это скопировать из STDIN во внутренний временной файл моей программы.
Пытаюсь решить ее так:
Пользовательский код:
Здесь метод MyFramework::FileUtils::openTmpfile просто берет ссылку на объект fstream и префикс к имени файла, затем открывает файл и возвращает его имя, к примеру "mcrypt_23A4.tmp" При использовании в командной строке Windows 7 x64 в таком виде:
Я наблюдаю зависание. Чтобы понять в чем собственно проблема я обрамил "output.write( buffer, len );" выводами в std::cerr количества прочитанного и записанного в файл. Результат: ноль прочитано и ноль же записано. Вот точнее:
Прошу помочь разобраться где я туплю? Это сообщение отредактировал(а) EvilsInterrupt - 16.10.2011, 12:22 |
||||||||
|
|||||||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Более, того, как наиболее красивее решить траблу чтения из stdin в raw режиме ?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
А еще оно может банально заблокироваться У STDIN потока (и равно как и любого другого, прикрепленного не к файлу) может EOF вообще не случиться - ну нету у коммуникационных ресурсов 'концов' На уровне ОС можно проверить тип файлового потока, но C++ stream эту информацию не предоставляет, увы |
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
||||||
|
|||||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
bsa,
Спасибо, а этот код на UNIX-like системе будет работать?
Насколько понял функция относится к runtime-библиотеке и вроде должен... xvr, Я правильно понимаю что символы перенаправления такие как '|', '<', '>' должна брать на себя оболочка. В случае windows это cmd.exe . Все верно? Это не программа парсит свою ком.строку...(было бы глупо) |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
- есть, которые как раз и обозначают конец передачи.. -------------------- undefined |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Думаю что нет. Просто заключи в #ifdef/#endif. Под *nix нет различия между двоичным и текстовым файлами. Более того, там даже нет O_BINARY. Добавлено через 2 минуты и 42 секунды
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Да Далеко не у всех. Например у COM порта, открытого в бинарном режиме, такого символа нет (даже если из машины физически выдернуть шнур, она этого не почувствует) |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
bsa,
Кажется ты прав ссылка на исходник Еще одна ссылка правда уже на Python. Похоже это стандартное решение. С помощью _setmode() функции Вопрос как поменять режим std::cin считаю закрытым. Другую часть темы завтра проведу эксперименты и отпишусь Это сообщение отредактировал(а) EvilsInterrupt - 18.10.2011, 23:33 |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
xvr,
Согласен но это есть решение "одна задача - одна программа". Т.е. когда чтото не имеет конца, пусть эту траблу решает другая программа. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| EvilsInterrupt |
|
||||||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
В общем-то, полез в Брайна Кернигана. Целью было выяснить ответ на вопрос по символам перенаправления.
Читаю:
Пытаюсь провести эксперимент:
Отлично работает, но как только:
Наблюдаю:
Кажется, ком. оболочка Windows более ограничена, чем я думал.... Это сообщение отредактировал(а) EvilsInterrupt - 20.10.2011, 10:24 |
||||||||
|
|||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
type игнорирует входной поток и ожидает 1 параметр. Так что вариант с type < .,,, в принципе ошибочный
PS. Символы * и ? во входной строке cmd.exe в Win не раскрывает, в отличие от Linux |
|||
|
||||
| feseal |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 18.5.2011 Репутация: нет Всего: нет |
Я не до конца разобрался, что хочет автор.
Какое назначение имеют строки при вызове
Если в качестве входного файла используется текстовый формат, то для направления его содержимого в std::cin оболочка использует оператор <, то есть myprog.exe <test-vector.txt 2> err.txt Using command redirection operators Если в качестве входного файла используется двоичный формат, то я бы посоветовал автору передать в программу имя двоичного файла через параметры командной строки, открыть его внутри и сделать копию. Так как для std::cin характерен текстовый ввод. Хотелось бы немного сказать о копировании в текстовом формате std::cin. Нет смысла писать свою функцию, достаточно воспользоваться алгоритмом std::copy:
Это сообщение отредактировал(а) feseal - 24.10.2011, 14:12 |
||||
|
|||||
| EvilsInterrupt |
|
||||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Закон разработки прост: Сначала пойми задачу, а потом принимайся за работу!!! Если ты не понял цели темы, то не берись отвечать никогда!!! Вобщем эксперименты таковы:
результат:
Как видно из этой цитаты вариант с cstdio-функциями( все что после надписи "first" ) работает и чтото все-таки прочитано. В отличие от первого второй вариант ( все что после слова "Second" ) не вывел ничего! Как примерно устроено внутри можно почитать Adding Console I/O to a Win32 GUI App О том как настроить студию на прием данных из STDIN можно почитать Project Settings for a C++ Debug Configuration . А точнее в command argument указать "< filename" (при применении ковычки убрать). К чему пришел: На практике мне куда дешевле воспользоваться рабочим вариантом на базе cstdio-библиотеки и работоспособный код копирования из STDIN во временной файл получу куда быстрее, чем еще черт знает сколько времени убивать на разбирательство с STL-стримами. Однако все же буду очень рад любой подсказке, что не так с вариантом копирования на базе применения С++ стримов ? Где я ошибаюсь? Почему применяя std::cin у меня не пашет? Это сообщение отредактировал(а) EvilsInterrupt - 9.11.2011, 00:29 |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |