Ответ 1
Вы можете выполнить кастинг по указателю...
outfile.write((char *)&data[0], data_size);
то же самое можно сделать для чтения (т.е. просто передать указатель на первый элемент массива unsigned char, наведя его на указатель на char).
Я делал программу, которая читала двоичные файлы. Итак, я читаю отдельные байты в unsigned chars (фактически читая данные в виде символов и отбрасывая их на неподписанные символы для каждого символа). Теперь мне нужно записать символы без знака в двоичный файл.
Проблема заключается в том, что теперь я вынужден писать отдельные байты после их добавления в символы (потому что write() для двоичных файлов ожидает char * buffer). Итак, теперь я должен сделать следующее:
for(int x=0; x<data_size; x++)
{
ch=(char)data[x];
outfile.write(&ch,1);
}
Есть ли способ обойти эту вещь, чтобы уменьшить количество операций ввода-вывода в случае чтения и записи?
Вы можете выполнить кастинг по указателю...
outfile.write((char *)&data[0], data_size);
то же самое можно сделать для чтения (т.е. просто передать указатель на первый элемент массива unsigned char, наведя его на указатель на char).
Тип 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
Когда 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);
И вы делаете все сразу. Обратите внимание, что это превосходит проверку типа и, следовательно, не лучшее решение.