无符号字符不输入所有 3 位数字

unsigned char not inputting all 3 digits

本文关键字:数字 字符 输入 无符号      更新时间:2023-10-16

我正在尝试将颜色的RGB值存储到名为RGBTriple的结构中,该结构由三个无符号的字符红色,绿色,蓝色组成。我正在从文件中读取这些值,然后解析字符串并使用正确的变量分配正确的值。每当我读取无符号字符值时,即使值为 255,程序也只读取第一个数字。读入宽度、高度和颜色后。我正在创建一个图片对象。我在阅读宽度或高度方面没有任何问题。

这是我的RGB文件。

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

使用输入运算符

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 个字符。我建议你阅读shortint 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;

运算符重载>>根据操作数的类型解释流。 如果类型是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的建议进行分配更有意义。