2015-11-18 2 views
1

При использовании std::istringstream для чтения значений серого пикселя из файла (0-255) я замечаю странное поведение, и я не могу понять, что происходит.C++ Чтение ints как unsigned chars с использованием istringstream

Чтобы сохранить память, я хочу прочитать эти значения в unsigned chars (так как они имеют одинаковый диапазон 0-255). Однако, похоже, происходит какое-то отбрасывание/усечение.

входной файл:

194 
194 
155 
155 
124 
194 

Вот мой код:

getline(fp, line); 
unsigned char temp; 
istringstream iss(line); 
iss >> temp; 

Когда значение в файле 194, например, целое значение температуры является 49 ...

Что такое литье?

+0

Вы можете использовать неформатированный ввод: 'std :: istream :: get' для байтов. –

+0

Вопрос не в том, чтобы исправить код, это какой тип каста/усечения происходит? – user2600959

+1

Пожалуйста, будьте более четкими относительно ваших входных данных. На данный момент мы можем только _guess_ в его формате, потому что «читать значения из файла» ничего не сообщает нам ничего! Мое предположение - это номера с пробелами в диапазоне 0 <= x <= 255 в десятичной форме, читаемой человеком, через ASCII. –

ответ

3

Нет никакого каста, это связано с перегрузкой.

std::basic_istream::operator>> случается перегружен char типов, извлекая только один символ в то время - 1, ASCII значение, которое 49. Это поведение, которое вы хотите, когда вы читаете отдельные символы, и предполагается, что вы хотите именно это, когда вы извлекаете тип символа.

Чтобы прочитать текст в виде чисел с пробелами, вы должны использовать больший тип для извлечения, например. unsigned short или std::uint16_t, а затем отбрасывают до unsigned char.

+0

Спасибо! Это тот ответ, который я искал! – user2600959

+2

Вы также можете проверить, находится ли значение в диапазоне 'unsigned char' перед литой. – LogicStuff

+0

Кастинг для 'unsigned char' четко определен, поэтому нет необходимости делать чек, если вы не хотите иметь специальную обработку для неожиданных значений. –