Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› cout и символ конца строки - сложный вопрос |
Посл.ответ | Сообщение |
|
Создано: 15 февраля 2008 03:19 · Поправил: smex · Личное сообщение · #1 Доброго времени суток уважаемые форумчане. Страшнейшая сложность постигла меня, день просидел, ниче не придумал. Был готов скинуть комп с балкона, но удержался... Ладно, не буду воду лить, сразу вопрос: ch=0xA; cout<<ch; На самом деле выведет 0x0D0A. То есть добавляет символ конца строки. Кто нибудь может подскажет как его не добавлять. Уже испробовал все - и с флагами игрался (setf, unsetf) и cout(ios::binary); делал, ничего не помогает. Может кто знает как решить эту сложнейшую задачу. PS: Нужно это для того что бы с моей программой можно было нормально работать как через консоль, так и через файлы, используя перенапрапление ввода-вывода (< или >), так вот, из за этой лажы не могу сделать вывод файл 0A без 0D. PS2: Понимаю что вопрос многим придется не по душе, а я задал сюда так как это единственны форум на котором я общаюсь. Если нет возможности помоч с проблемой, по возможности пошлите на нормальный форум по программингу. ![]() |
|
Создано: 15 февраля 2008 10:32 · Личное сообщение · #2 |
|
Создано: 15 февраля 2008 13:28 · Поправил: HiEndsoft · Личное сообщение · #3 |
|
Создано: 15 февраля 2008 13:45 · Личное сообщение · #4 Ох ты точно, надо побаловаться с API. Хотя изврат это, кроссплатформенность теряется. TO ssx: Да, тока что проверил - тоже самое. Самое главное даже printf и все сишные функции творят такой безпредел. Верю что как то можно сказать им выводить как есть, поэтому вопрос оставлю открытым. PS: Понимю, что вопрос совсем не по тематике сайта, поэтому прошу прощения если кто посчитал его за флуд. Просто среди ночи не выдержал извражаться с этим cout и вылил все что я о нем думаю сюда... ![]() |
|
Создано: 15 февраля 2008 14:46 · Поправил: cppasm · Личное сообщение · #5 |
|
Создано: 15 февраля 2008 15:13 · Поправил: UR-Shark · Личное сообщение · #6 |
|
Создано: 15 февраля 2008 15:23 · Поправил: HiEndsoft · Личное сообщение · #7 |
|
Создано: 15 февраля 2008 20:18 · Личное сообщение · #8 cppasm: Да именно, программа выводит результаты своей работы. И одно из условий перенапраление потока вывода куда угодно. UR-Shark: Да ты прав, я этот способ давно прошарил и пока он работает как заглушка. У него есть минус - привязка к конкретному файлу. HiEndsoft: cout ведь есть и в линуксе, однако API в линуксе совсем другие... Может и не изврат, но потеря кроссплтформенности. PS: А может так невозможно сделать. Может перенаправление cout и cin, способны работать только в текстовом режиме. Наверное так оно и есть. Разочаровался я очень в ООП, а такая получилась бы отличная, понятная программа... ![]() |
|
Создано: 16 февраля 2008 01:25 · Личное сообщение · #9 smex, AFAIK перекодировка в "\r\n" сидит во всех стпндартных классах работы со строками и потоками (streams) для доса и винды. Ведь unix-овый файл Notepad не читает ![]() Кста, ты запутаешь windows проги если в поток будешь гнать строки с "\n" ![]() |
|
Создано: 16 февраля 2008 12:31 · Личное сообщение · #10 unsigned int ch=0xA; cout<<ch; и все работает >PS: А может так невозможно сделать. Может перенаправление cout и cin, способны работать только в >текстовом режиме. Наверное так оно и есть. Разочаровался я очень в ООП, а такая получилась бы >отличная, понятная программа... как в нем можно разочароваться когда вы его и не знаете ![]() |
|
Создано: 16 февраля 2008 23:57 · Личное сообщение · #11 reversecode пишет: unsigned int ch=0xA; cout<<ch; Для тех кто в танке - это не работает. Точнее не так как хочет автор. Напиши такой код а потом запусти свою прогу test.exe > log.txt и посмотри что в txt будет записано 2 байта - вместо 0Ah который ты выводиш будет 0Dh 0Ah UR-Shark пишет: А не сходить бы вам в MSDN? Окрывать нужно в двоичном режиме. Если юзаешь fopen то делай так: fopen("a.txt","wb"); Это не новость, но подходит только для файлов. Для консоли это не работает. smex пишет: cppasm: Да именно, программа выводит результаты своей работы. И одно из условий перенапраление потока вывода куда угодно. Тогда не понятно такое острое желание получить именно \n в файле вместо \r\n На Win32 платформе это будет расценено как один перевод строки, а если под nix запустить программу с перенаправлением вывода, то там не будет такого преобразования. Т.е. в файле будет один байт 0Ah Проблемы возможны только если лог создавать под Win, а читать под Nix, и наоборот. Но такие проблемы в принципе существуют для всех текстовых файлов - потому что под Win перевод строки это '\r\n', а под Nix просто '\n' Можно написать недольшой конвертер, да и готовые есть... ![]() |
|
Создано: 17 февраля 2008 01:58 · Личное сообщение · #12 |
|
Создано: 17 февраля 2008 11:16 · Поправил: cppasm · Личное сообщение · #13 reversecode пишет: может у меня танк не такой, пусть каждый попробует у себя сам Может и не такой ![]() Но это reversecode пишет: unsigned int ch=0xA; cout<<ch; и это reversecode пишет: nsigned char d = 0xa; cout << binary << d << flush; это немного разные вещи. С бинари конечно работает. Вопрос по сути был как для консоли поменять режим вывода на бинарный. На Си работает так: #include<io.h> #include<fcntl.h> #include<stdio.h> void main(void) { setmode(fileno(stdout),O_BINARY); printf("\n"); } reversecode пишет: PS unix.... windows ... какая им разница, ООП лишь обертка над printf Разница есть. Напиши: #include<io.h> #include<fcntl.h> #include<stdio.h> void main(void) { setmode(fileno(stdout),O_BINARY); printf("Line1\nLine2\n"); } И запусти test.exe >log.txt А потом открой этот log.txt под Win и под Nix. Под Nix всё будет нормально, а вот что под Win будет можеш посмотреть в блокноте. А если писать "\r\n" - то ситуация будет обратная, в Win ok, а в Nix нет. ![]() |
|
Создано: 17 февраля 2008 19:25 · Личное сообщение · #14 |
|
Создано: 20 февраля 2008 02:13 · Личное сообщение · #15 Сори парни. Я отлучился на пару дней. Но я просто в восторге от этого форума и контингента людей, находящихся здесь!! Меня не раз выручали, и вот снова блестящий ответ на мой вопрос. Большое человеческое спасибо - setmode(fileno(stdout),O_BINARY);. Это действительно работает. PS: Вот только не получилось с минипулятором потока <<binary<<. Пишет неизвестный идентификатор. Подрубал все известные мне библы, почитал умную книжку - нигде о нем ничего не упоминается. Подскажите как у вас это запустилось. ![]() |
|
Создано: 20 февраля 2008 12:23 · Личное сообщение · #16 |
|
Создано: 20 февраля 2008 20:13 · Личное сообщение · #17 |
|
Создано: 21 февраля 2008 04:36 · Личное сообщение · #18 |
|
Создано: 29 февраля 2008 21:32 · Личное сообщение · #19 |
|
Создано: 29 февраля 2008 21:57 · Личное сообщение · #20 |
|
Создано: 29 февраля 2008 22:05 · Поправил: -Garrett- · Личное сообщение · #21 |
|
Создано: 29 февраля 2008 23:10 · Поправил: HiEndsoft · Личное сообщение · #22 |
|
Создано: 29 февраля 2008 23:24 · Поправил: -Garrett- · Личное сообщение · #23 |
|
Создано: 02 марта 2008 13:24 · Личное сообщение · #24 cppasm пишет: вместо 0Ah который ты выводиш будет 0Dh 0Ah Думаю, ты просто опечатался. 0x30 0x41 smex пишет: <<binary<<. Пишет неизвестный идентификатор Так и должно быть. Автор похоже не запускал это код, даже если он и как-то умудрился собраться. Ибо вот, например, фрагмент реализации iostreams: /// 27.4.2 Class ios_base [ios.base] class ios_base { /// 27.4.2.1.4 Type ios_base::openmode [ios::openmode] typedef uint8_t openmode; static const openmode binary = 1 << 5; ... Соответственно в вывод пойдет 32 (число зависит от реализации библиотеки) А вот что такое манипуляторы: ///\name 27.4.5.1 fmtflags manipulators [fmtflags.manip] inline ios_base& boolalpha(ios_base& str) { str.setf(ios_base::boolalpha); return str; } Работает это довольно хитро - в классе basic_ostream есть специальные функции-члены; для данного случая: basic_ostream<charT, traits>& operator<<(ios_base& (*pf)(ios_base&)) { pf(*this); return *this; } -Garrett- пишет: Как получить их ansi "изображение" Изображением 0x07 является бип ![]() ![]() |
![]() |
eXeL@B —› Программирование —› cout и символ конца строки - сложный вопрос |