std :: cout изменяет содержимое байта на символ EOL [дубликат]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
14
задан izhak 13 April 2011 в 19:52
поделиться

2 ответа

Не думаю, что вы можете заставить 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
    }
}
4
ответ дан Potatoswatter 27 August 2018 в 23:06
поделиться

Это работает с использованием Visual Studio 2013:

#include <io.h>
#include <fcntl.h>
#include <iostream>

int main( int argc, char * argv[] )
{
    _setmode( _fileno( stdout ),  _O_BINARY );
    std::cout << std::endl;
}

Он выведет только [0A], а не [0D] [0A].

5
ответ дан Rob K 27 August 2018 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: