首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从CArchive读取单词变量并同时转换为int

从CArchive读取单词变量并同时转换为int
EN

Stack Overflow用户
提问于 2019-11-07 01:55:50
回答 2查看 73关注 0票数 3

这听起来可能很基本,但:

代码语言:javascript
运行
AI代码解释
复制
WORD wSong = 0;
CArchive ar;
...
ar >> wSong;
m_sPublicTalkInfo.iSongStart = static_cast<int>(wSong);

目前,我将WORD读入一个特定的变量,并对其进行强制转换。

我能同时读一读吗?

请注意,我不能序列化一个int。它必须是一个WORD并转换为int。或

代码语言:javascript
运行
AI代码解释
复制
ar >> wSong;
m_sPublicTalkInfo.iSongStart = static_cast<int>(wSong);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-07 02:06:49

我不认为有直接的办法。您可以实现一个助手函数:

代码语言:javascript
运行
AI代码解释
复制
template <typename T, typename U>
T readAndCast (CArchive& ar) {
  U x;
  ar >> x;
  return static_cast<T> (x);
}


m_sPublicTalkInfo.iSongStart = readAndCast<int, WORD>(ar);

在您的程序中使用固定宽度整数类型可能更好,例如,也许int_least16_t而不是int,以确保类型具有正确的大小。WORD固定到16位,但是int不是。另外,WORD没有签名,int没有签名,所以在转换过程中可能会出现溢出。

票数 5
EN

Stack Overflow用户

发布于 2019-11-07 16:08:03

这是一个示例,说明如果希望序列化语法保持一致,可以如何创建包装器。它只用于处理积分和MFC无符号类型。

代码语言:javascript
运行
AI代码解释
复制
#include <iostream>
#include <cstdint>
#include <sstream>
#include <type_traits>

// Fake the MFC types
using BYTE = std::uint8_t;
using WORD = std::uint16_t;
using DWORD = std::uint32_t;
using QWORD = std::uint64_t;

template<typename T>
struct is_valid_save_type : std::bool_constant<
    std::is_same_v<BYTE, T> ||
    std::is_same_v<WORD, T> ||
    std::is_same_v<DWORD, T> ||
    std::is_same_v<QWORD, T>
> {};

template<typename T>
struct is_valid_load_type : is_valid_save_type<T> {};

// Saves type T as a SaveType
template<typename T, typename SaveType>
struct save_as_type
{
    explicit save_as_type(T value) : value(value) {}

    explicit operator SaveType() const
    {
        return static_cast<SaveType>(value);
    }

private:
    T value;

    // This class only works with integrals
    static_assert(std::is_integral_v<T>);

    // SaveType should be BYTE/WORD/DWORD/QWORD only
    static_assert(is_valid_save_type<SaveType>::value);
};

// Loads type T as a LoadType
template<typename T, typename LoadType>
struct load_as_type
{
    explicit load_as_type(T& value) : value_(value) {}

    load_as_type& operator=(LoadType rhs)
    {
        value_ = rhs;
        return *this;
    }

private:
    T& value_;

    // T should be an integral
    static_assert(std::is_integral_v<T>);

    // T must be non-constant
    static_assert(!std::is_const_v<T>);

    // LoadType should be BYTE/WORD/DWORD/QWORD only
    static_assert(is_valid_load_type<LoadType>::value);
};

class CArchive;

// Make the above types serializable
template<typename T, typename SaveType>
CArchive& operator<<(CArchive& ar, save_as_type<T, SaveType> const& s)
{
    ar << static_cast<SaveType>(s);
}

template<typename T, typename LoadType>
CArchive& operator>>(CArchive& ar, load_as_type<T, LoadType> l)
{
    LoadType t{};
    ar >> t;
    l = t;
}

// Use the following two functions in your code
template<typename SaveType, typename T>
save_as_type<T, SaveType> save_as(T const& t)
{
    return save_as_type<T, SaveType>{ t };
}

template<typename LoadType, typename T>
load_as_type<T, LoadType> load_as(T& t)
{
    return load_as_type<T, LoadType>{ t };
}

// Prevent loading into temporaries; i.e. load_as<BYTE>(11);
template<typename T, typename LoadType>
load_as_type<T, LoadType> load_as(const T&& t) = delete;

// Fake MFC Archive
class CArchive
{
public:
    CArchive& operator<<(int i)
    {
        std::cout << "Saving " << i << " as an int\n";
        return *this;
    }

    CArchive& operator<<(BYTE b)
    {
        std::cout << "Saving " << (int)b << " as a BYTE\n";
        return *this;
    }

    CArchive& operator<<(WORD w)
    {
        std::cout << "Saving " << (int)w << " as a WORD\n";
        return *this;
    }

    CArchive& operator<<(DWORD d)
    {
        std::cout << "Saving " << (int)d << " as a DWORD\n";
        return *this;
    }

    CArchive& operator>>(int& i)
    {
        std::cout << "Loading as an int\n";
        return *this;
    }

    CArchive& operator>>(BYTE& b)
    {
        std::cout << "Loading as a BYTE\n";
        return *this;
    }

    CArchive& operator>>(WORD& w)
    {
        std::cout << "Loading as a WORD\n";
        return *this;
    }

    CArchive& operator>>(DWORD& d)
    {
        std::cout << "Loading as a DWORD\n";
        return *this;
    }
};

int main()
{
    CArchive ar;

    int out_1 = 1;
    int out_2 = 2;
    int out_3 = 3;
    int out_4 = 4;

    ar << out_1 <<
        save_as<BYTE>(out_2) <<
        save_as<WORD>(out_3) <<
        save_as<DWORD>(out_4);

    std::cout << "\n";

    int in_1 = 0;
    int in_2 = 0;
    int in_3 = 0;
    int in_4 = 0;

    ar >> in_1 >>
        load_as<BYTE>(in_2) >>
        load_as<WORD>(in_3) >>
        load_as<DWORD>(in_4);

    return 0;
}

输出:

将1保存为int

将2保存为字节

保留3作为一个词

将4保存为DWORD

作为int加载

以字节形式加载

加载为一个词

作为DWORD加载

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58746123

复制
相关文章
char转换为数字_char字符转int
刷题遇到一个考点是 char型数字 转 int 进行计算的问题。一看就会,一做就错,显然是在这里的认识薄弱了。将一番搜索的结果记录下来,以备再忘来打脸。
全栈程序员站长
2022/11/10
4.3K0
将tensor转换为图像_tensor转int
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
12K0
outputstream转byte数组_int类型转换为byte类型
Java中将inputstream输入流转换成byte[]字节数组
全栈程序员站长
2022/11/08
8K0
java字符串类型转换为int_java中double转int类型
由于double的范围比int数据类型大,所以当int值被赋给double时,java会自动将int值转换为double。
全栈程序员站长
2022/08/03
4.4K0
python 逐行读取并赋值变量
如果程序要读取行,通常只能用文本方式来读取,道理很简单,只有文本文件才有行的概念,二进制文件没有所谓行的概念。
matinal
2023/10/13
2230
integer转换为string_go 字符串转int
str := “123” // string 转 int i, err := strconv.Atoi(str) if err == nil {   fmt.Printf(“i: %v\n”,i) } // string 转 int64 i64,err := strconv.ParseInt(str,10,64) if err == nil {   fmt.Printf(“i64: %v\n”,i64) } // string 转 int32 j,err := strconv.ParseInt(str,10,32) if err == nil {   fmt.Printf(“i32: %v\n”,int32(j)) }
全栈程序员站长
2022/11/06
3.6K0
java把string转int类型_java把String类型转换为int类型的方法
这篇文章将为大家详细讲解有关java把String类型转换为int类型的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
全栈程序员站长
2022/11/10
4.4K0
java把string转int类型_java把String类型转换为int类型的方法
Golang中Int32转换为int16丢失精度的具体过程
Int32转换为int16会丢失精度,这是总所周知的,但是具体如何丢失精度的,请看下面的代码:
全栈程序员站长
2022/09/21
2.5K0
Golang中Int32转换为int16丢失精度的具体过程
数制转换itoa atoi int转字符串 字符串转int string转int int转string
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。 1.itoa():将整型值转换为字符串。 用法itoa(int,char*,int) 即(要转化的整形数,目标字符数组,进制) 2. ltoa():将长整型值转换为字符串。 用法ltoa(long,char*,int) 即(要转化的长整形数,目标字符数组,进制) ● gcvt():将浮点型数转换为字符串,取四舍五入。 用法gcvt(double,int,char*) 即(要转化的双精度浮点数,保留位数,目标字符串) ● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。 用法charecvt(double,int,int,int*) charecvt(双精度浮点数,保留位数,小数点位置,转换浮点数的符号) 这个函数存储最多ndigit个数字值作为一个字符串,并添加一个空数字符(’\0’),如果双精度浮点数中的数字个数超过保留位数,低位数字被舍入。如果少于保留位数个数字,该字符串用0填充浮点数符号0为正其余为负数。 ● fcvt():指定位数为转换精度,其余同ecvt()。 用法charfcvt(double,int,int*,int*) charfcvt(双精度浮点数,保留小数点后位数,小数点位置,转换浮点数的符号) 2. C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。 ● atof():将字符串转换为双精度浮点型值。 double atof=char(const char) ● atoi():将字符串转换为整型值。用法同上。 ● atol():将字符串转换为长整型值。用法同上。 ● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。double strtod(char * str,char * str) double strtod(转换的来源字符串首地址,不能转换数字的首地址) ● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。 strtol(char * str,char * str,int) double strtol(转换的来源字符串首地址,不能转换数字的首地址,基于进制) ● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。用法同上。
风骨散人Chiam
2020/10/28
4.1K0
java中string转换为int(int char)
// String change int public static void main(String[] args) { String str = “123”; int n; // first method // n = Integer.parseInt(str); n = 0; n = Integer.parseInt(str); System.out.println(“Integer.parseInt(str):”+ n); System.out.println(“\n”); //second method //n = Integer.valueOf(str).intValue();
全栈程序员站长
2022/07/28
1.9K0
java中string转换为int(int char)
CString转int
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/124759.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/21
1.5K0
JAVA float转int 如何取整_int型变量n转化成float
网上巴巴的说了那么多,倒是给个结论啊.搜索半天,浪费一堆时间,不知道到底哪个说的对哪个说的错. 直接自己写着看吧.
全栈程序员站长
2022/11/17
1.3K0
JAVA float转int 如何取整_int型变量n转化成float
flink读取kafka数据并写入HDFS 转
### 本地代码flink streaming读取远程环境的kafka的数据,写入远程环境的HDFS中; public static void main(String[] args) throws Exception { // set up the streaming execution environment final StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEn
stys35
2019/03/05
8.4K1
c++ int、long long 转string int转wstring
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146501.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/28
2.9K0
javachar转int_c中int转char
A:因为char是JAVA中的保留字,与别的语言不同,char在JAVA中是16位(bit)(JAVA用的是unicode,2个字节(byte))。不过八位的ASCII码包含在unicode中(0~127)。
全栈程序员站长
2022/11/11
1.8K0
C++ CString转int int转CString「建议收藏」
1.CString 转 int CString strtemp = “100”; int intResult; intResult= atoi(strtemp); —————————————————————– 2 int 转 CString CString strtemp; int i = 2334; strtemp.Format(“%d”,i);
全栈程序员站长
2022/07/22
1.9K0
数据库char转int_mysql string转int
首先char类型的必须是数字,将字符的数32313133353236313431303231363533e58685e5aeb931333431373262字转成数字,比如’0’转成0可以直接用加法来实现;
全栈程序员站长
2022/11/10
5.4K0
数据库char转int_mysql string转int
String类型转int,转long
转int: int b = (int)Double.parseDouble(str);
全栈程序员站长
2022/09/06
4.3K0
JMeter 参数化之利用JDBCConnectionConfiguration从数据库读取数据并关联变量
http://dev.mysql.com/downloads/connector/j/
授客
2019/09/11
8880
JMeter 参数化之利用JDBCConnectionConfiguration从数据库读取数据并关联变量
int转long类型[通俗易懂]
Integer a = new Integer(10); long b = a.longValue();
全栈程序员站长
2022/09/06
3.6K0

相似问题

将字符从文件读取行转换为int转储核

14

读取用CArchive Ar存储的数据(&SaveDataStoreDetail,CArchive::store);

15

如何将int变量转换为ascii单词

22

将GHC.Int.Int64转换为Int

27

同时读取行,awk $line并写入变量

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档