Я не верю, что вы можете заставить std::cout
выводить двоичные данные. Интерфейс самого низкого уровня, доступный пользователю через C++, — это streambuf
в std::cout.rdbuf()
. Вы вполне можете предположить, что объект имеет тип basic_filebuf
, а раздел §27.9.1.4 стандарта C++11 требует, чтобы basic_filebuf
реализовывал отдельные текстовый и двоичный режимы.
Проверьте расширения для вашей платформы, чтобы узнать, как открыть другой поток для stdout
, используя его файловый дескриптор. Затем вы можете указать std::binary
в флагах режима.
Однако, вероятно, проще направить вывод через вторую программу, которая преобразует окончания строк.
Редактировать: Теперь я вижу, что вы, возможно, захотите пойти немного дальше, чтобы действительно заставить программу напрямую выводить то, что вы хотите.
Вы можете использовать интерфейс C для вывода новых строк, если интерфейс C++ установлен в небуферизованный режим.
В самом начале вашей программы, прежде чем cout
получит какие-либо выходные данные, сделайте следующее:
std::cout.rdbuf()->pubsetbuf( 0, 0 ); // go to unbuffered mode
Если вы хотите вывести новую строку, сделайте это так:
_write( STDOUT_FILENO, 1, "\n" ); // do not convert line ending
Вы можете обернуть этот маленький... самородок... внутри пользовательского манипулятора:
#include <unistd.h>
std::ostream &endln( std::ostream &s ) {
if ( s->rdbuf() == std::cout.rdbuf() ) { // this is cout or cerr into cout
_write( STDOUT_FILENO, 1, "\n" ); // do not convert line ending
return s; // stream is unbuffered, no need to flush
} else {
return std::endl( s ); // other streams do convert to \r\n
}
}
person
Potatoswatter
schedule
13.04.2011