Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена в нуль (т. е. она не ссылалась на экземпляр фактического объекта).
Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для 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
}
Не думаю, что вы можете заставить 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
}
}
Это работает с использованием 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].