首页 文章

istringstream十进制整数输入为8位类型

提问于
浏览
4

这个:

#include <iostream>
#include <sstream>
#include <inttypes.h>

using namespace std;

int main (void) {
    istringstream iss("123 42");
    int8_t x;
    while (iss >> x) {
        cout << x << endl;
    }
    return 0;
}

生产环境 :

1
2
3
4
2

但我想要:

123
42

转换 iss >> (int)x (我最初尝试使用 char )给了我“ error :无效的操作数到二进制表达式('istringstream'(又名'basic_istringstream')和'int')" (clang) or " error :'运算符>>'(g)的模糊重载 .

有没有办法将值直接读入 8-bit 类型,或者我是否必须使用中间存储?

4 回答

  • 2

    您必须使用中间类型或自己进行解析 . 所有char类型(char,signed char和unsigned char)都被视为文本元素,而不是整数 . int8_t可能只是其中一个的typedef,这就是你的代码失败的原因 .

    注意:

    • 输出将遇到相同的问题 .

    • 不要使用C风格的强制转换,它们几乎只会导致错误 .

    • 在输入操作无效之前检查EOF,您需要在之后检查故障 .

  • 1

    没有内置的8位类型;您正在使用 signed char 的别名,当您将输入格式化为任何类型的 char 时,IOStreams将始终提取单个ASCII字母 .

    所以,是的,使用中间存储,或将 int8_t 包装在为格式化I / O提供其自身重载的新类中(除非您有严格的内存和/或性能要求,否则我认为这是过度杀戮) .

    (您对 iss >> (int)x 的尝试非常困惑;转换用于您将要获取值的表达式,而不是用于命名要设置值的对象的左值 . )

  • 1

    根本问题是 int8_t 通常(显然包括你的情况)类似于: typedef char int8_t; . 无论好坏,iostream都会为 char 提供重载,假设内容是字符而不是数字 .

    可以避免这种情况,例如通过定义自己的类,例如:

    class my_int8_t {
        // ...
    };
    

    在这种情况下,您可以为该类型提供自己的 operator>>operator<< 重载(将内容视为数字而不是字符) .

    一旦你有了这个,将数据从输入复制到输出(每行一个数字)可能更好地完成如下:

    std::copy(std::istream_iterator<my_int8_t>(std::cin), 
              std::istream_iterator<my_int8_t>(),
              std::ostream_iterator<my_int8_t>(std::cout, "\n"));
    

    其中,这可以避免当前代码中的问题,即正确检测文件结尾 .

  • 2
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    typedef unsigned char uint8_t;
    class exstringstream : public stringstream
    {
    public:
        exstringstream(const string& s)
            :stringstream(s)
        {
    
        }
        friend exstringstream& operator >> (exstringstream&, uint8_t& t); 
    };
    
    exstringstream& operator >> (exstringstream& ss, uint8_t& t)
    {
        unsigned int val;
        stringstream& s = ss;
        s >> val;
    
        t = static_cast<uint8_t>(val);
    
        return ss;
    }
    
    int main()
    {
        string str("123 45");
        exstringstream ss(str);
    
        uint8_t a, b;
        ss >> a >> b;
        cout << a << " " << b << endl;
        return 0;
    }
    

相关问题