Запись неподписанных символов в двоичный файл с помощью write()

Я делал программу, которая читала двоичные файлы. Итак, я читаю отдельные байты в unsigned chars (фактически читая данные в виде символов и отбрасывая их на неподписанные символы для каждого символа). Теперь мне нужно записать символы без знака в двоичный файл.

Проблема заключается в том, что теперь я вынужден писать отдельные байты после их добавления в символы (потому что write() для двоичных файлов ожидает char * buffer). Итак, теперь я должен сделать следующее:

for(int x=0; x<data_size; x++)
{
    ch=(char)data[x];
    outfile.write(&ch,1);
}

Есть ли способ обойти эту вещь, чтобы уменьшить количество операций ввода-вывода в случае чтения и записи?

Ответ 1

Вы можете выполнить кастинг по указателю...

outfile.write((char *)&data[0], data_size);

то же самое можно сделать для чтения (т.е. просто передать указатель на первый элемент массива unsigned char, наведя его на указатель на char).

Ответ 2

Тип outfile равен ofstream, правильно? ofstream является typedef для,

typedef std::basic_ofstream<char, std::char_traits<char> > ofstream;

Вам нужен ваш typedef,

typedef std::basic_ofstream<unsigned char, std::char_traits<unsigned char> > uofstream;

И затем,

uofstream outfile(...);
outfile.write(data, data_size); //no need to cast

Ответ 3

Когда data имеет тип unsigned char* или unsigned char[], и вы просто хотите записать биты в файл, выполните следующие действия:

for(int x=0; x<data_size; x++)
{
outfile.write((char*)data + x, 1);
}

Как литье удаляет проблему по одному за раз:

outfile.write((char*)data, data_size);

И вы делаете все сразу. Обратите внимание, что это превосходит проверку типа и, следовательно, не лучшее решение.