我试图将颜色的RGB值存储到名为RGBTriple的结构中,该结构由三个无符号字符红色,绿色,蓝色组成。我正在从文件中读取这些值,然后解析字符串并使用正确的变量分配正确的值。每当我读取unsigned char值时,即使值为255,程序也只读取第一个数字。读入宽度,高度和颜色后。我正在创建一个图片对象。我在阅读宽度或高度时没有任何问题。
这是我的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
答案 0 :(得分: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个字符。我建议您阅读short
或int
{/ 1}}的{{1}},而不是将这些值分配给以下结构:
unsigned char
答案 1 :(得分: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的建议进行分配更有意义。