2016-02-24 3 views
2

Я пытаюсь сохранить значения RGB цвета в структуру с именем RGBTriple, которая состоит из трех символов unsigned char Red, Green, Blue. Я читаю эти значения из файла и затем разбираю строку и присваивая правильное значение правильной переменной. Всякий раз, когда я читаю значения unsigned char, программа считывает только первое число, даже если значение равно 255. После чтения ширины, высоты и цвета. Я создаю объект изображения. У меня нет никаких проблем с чтением по ширине или высоте.unsigned char не вводит все 3 цифры

Вот мой RGBTriple

struct RGBTriple 
{ 
    unsigned char Blue; 
    unsigned char Green; 
    unsigned char Red; 

    RGBTriple(); 
    RGBTriple(unsigned char Blue, unsigned char Green, unsigned char Red); 
}; 

и вот мой главный:

int pictureWidth, pictureHeight; 
RGBTriple pictureColor; 
string line; 

    getline(input, line); 
    istringstream iss(line); 

    iss >> pictureWidth; 
    iss >> pictureHeight; 
    iss >> pictureColor.Red; 
    iss >> pictureColor.Green; 
    iss >> pictureColor.Blue; 


    Picture newPicture(pictureWidth, pictureHeight, pictureColor); 

Вот пример моего входа: первая строка является то, что читается для объекта изображения.

200 200 255 255 255 
Point 66 66 000 000 000 
Line 100 150 50 50 255 000 000 
Rectangle 50 25 55 33 000 000 000 
RTriangle 10 80 50 30 000 000 000 
Star 29 29 15 000 000 000 
Diamond 120 120 20 000 000 000 
Polygon 150 0 175 0 175 50 150 25 X X 000 000 000 
Circle 40 89 26 000 000 000 
+2

Дайте нам пример того, что содержит строка, какие значения вы читаете и какие значения вы считаете нужным читать. –

ответ

4

Оператор вход используется

std::istream& operator >> (std::istream& stream, unsigned char& value) 

вместо

std::istream& operator >> (std::istream& stream, short& value) 

или

std::istream& operator >> (std::istream& stream, int& value) 

поэтому он считывает только один символ. Я suggesrt вы читать short или int instread из unsigned char с чем назначать, что значения структурировать как:

getline(input, line); 
istringstream iss(line); 

int iValue = 0; 

iss >> pictureWidth; 
iss >> pictureHeight; 
iss >> iValue; 
pictureColor.Red = iValue; 
iss >> iValue; 
pictureColor.Green = iValue; 
iss >> iValue; 
pictureColor.Blue = iValue; 
2

Оператор перегрузки для >> истолковывать поток в соответствии с типом операнда. Если тип char, он будет читать код символа, а не целое число, поэтому при представлении «255» будет читаться «2», а значение будет 0x32.

Вероятно, было бы более целесообразно использовать std::uint8_t, а затем char для хранения значений RGB, в этом случае другая возможность явно перегружать >> оператор для std::uint8_t:

inline std::istream &operator >> (std::istream &is, std::uint8_t& c) 
{ 
    int iValue = 0; 
    is >> iValue; 
    c = iValue; 
    return is; 
} 

Но, сделав это, вы как бы вынуждены поддерживать std::int8_t и < <; если вы не выполняете много таких операций, извлечение в числовой целочисленный тип и назначение, предложенное Николаем, имеют больше смысла.

+0

не уверен, что это сработает, потому что вы создаете новые временные объекты (переменные) на месте, где должна использоваться ссылка на фактические переменные 'static_cast (c)' для создания допустимой ссылочной и возвращаемой возможности входного значения fucntion -> временного объекта X фактического стоимость. – Mykola

+0

на MSVC он даже не компилируется, потому что 'std :: istream' должен принимать ссылки на переменные. полное сообщение об ошибке 'ошибка C2678: двоичный '>>': оператор не найден, который принимает левый операнд типа 'std :: istream' (или нет приемлемого преобразования)'; IntelliSence информации ' IntelliSense: нет оператора ">>" соответствует этим операнды типов операндов: STD :: IStream >> ИНТ \t d: \ Projects \ 2 \ 2 \ 9 файл 2.cpp \t ' – Mykola

+0

Я уверен, что этого не будет!О чем я только думал!? – Clifford

Смежные вопросы