2016-02-24 36 views
2

我想將顏色的RGB值存儲到一個名爲RGBTriple的結構中,該結構由三個無符號字符紅,綠,藍組成。我正在從文件中讀取這些值,然後解析字符串並使用正確的變量分配正確的值。無論何時讀取無符號字符值,即使值爲255,程序也只讀取第一個數字。讀取寬度,高度和顏色後,我正在創建圖片對象。我在讀取寬度或高度時沒有任何問題。無符號字符不輸入所有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) 

所以它僅讀取1個字符。我suggesrt你閱讀shortint 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和< <;除非你正在執行很多這樣的操作,否則提取到數字整數類型並按照Mykola的建議進行分配更有意義。

+0

不確定這是否會起作用,因爲您在必須使用實際變量引用的地方構建新的臨時對象(變量)'static_cast (c)'創建賦值輸入值的有效引用和返回能力 - >臨時對象X實際值。因爲'std :: istream'必須接受對變量的引用,所以它甚至不能編譯MSVC上的 – Mykola

+0

。完整的錯誤信息'錯誤C2678:binary'>>':沒有發現操作符需要'std :: istream'類型的左側操作數(或者沒有可接受的轉換)'; intellisence信息'智能感知:沒有運營商 「>>」 匹配這些操作數 操作類型:標準:: istream的>> INT \t d:\項目\ 2 \ 2 \ 2.cpp ' – Mykola

+0

我肯定它不會!我在想什麼!? – Clifford

相關問題