2015-01-15 2 views
-1

Я использую эту функцию для записи двоичных файлов:ostream :: запись - Что происходит, когда мой streamsize меньше, чем мой полукокс

ostream& write (const char* s, streamsize n); 

мне интересно, что происходит, когда мой streamsize п меньше мой s. Мой исходный код выглядит примерно так:

int new_number = 10; 
out.write((char*) &new_number, sizeof (new_number)); 

Можете ли вы предсказать, что произойдет, когда я изменить его на:

int new_number = 10; 
out.write((char*) &new_number, 2); 

ли возможный способ сэкономить дисковое пространство? Извините, я забыл упомянуть, что хочу сохранить 24-битное целое число.

+2

_ «Это возможный способ сохранить дисковое пространство?» _ Нет! Если вы хотите сэкономить дисковое пространство_, используйте другой тип номера, например, например. 'Short'. –

+0

Он напишет два младших байта двоичного представления 'new_number'. Поскольку двоичное представление определено реализацией, результаты являются непредсказуемыми, технически говорящими. На типичной двухконечной двухкомпонентной машине это будет эквивалентно 'int16_t temp = static_cast (new_number); out.write ((char *) & temp, sizeof (temp)); ' –

+0

Извините, я забыл упомянуть, что хочу сохранить 24-битное целое число. Но для этого нет типа данных – Birdperson

ответ

0

Это будет запись первых двух байтов представления int. Это будет работать в некоторых ситуациях, но не является портативным:

  • если порядок байтов аппарата не прямой порядок байтов, то вы потеряете значение;
  • Если значение слишком велико для представления двумя байтами, вы получите неправильное значение;
  • если значение может быть отрицательным, тогда вам нужно быть осторожным, как вы его читаете;
  • если int меньше двух байтов, то вы не сэкономите место.

Было бы безопаснее преобразование в фиксированный размер, например int16_t, при необходимости проверив область.