Не вярвам, че можете да принудите 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