转换一个向量并将其写入 C++ stringstream
Cast a vector and write it in a C++ stringstream
在下面的玩具程序中,我使用 stringstream 写入和读取双精度向量。但是,我如何在 ss 中将 v 写为(舍入)uint 的向量,以便当 w 读取程序的输出是3?
#include <sstream>
#include <vector>
#include <iostream>
int main() {
std::vector<double> v = {0.1, 1.2, 2.6};
std::vector<double> w;
std::stringstream ss;
ss.write(const_cast<char*>(reinterpret_cast<const char*>(&v.at(0))), v.size() * sizeof(v.at(0))); // Here it should cast v first into uint an then into char
for(int i = 0; i < v.size(); ++i) {
double val; // It should be uint val
ss.read(reinterpret_cast<char*>(&val), sizeof(val));
w.push_back(val);
};
std::cout<<w.at(2)<<std::endl;
return 0;
}
假设您想像“从 x.5 向上取整”那样“取整”,您可以使用
std::cout<<(unsigned int)(w.at(2)+0.5)<<std::endl;
它使用 0.5 的偏移量来移动截断并根据需要进行四舍五入。
(在您显示的程序中使用这一行的)输出是
3
此代码读取向量,舍入值,然后一次写出一个值。从流中读回时相反。
#include <sstream>
#include <vector>
#include <iostream>
#include <cstdint>
#include <cmath>
int main() {
std::vector<double> v = {0.1, 1.2, 2.6};
std::vector<double> w;
std::stringstream ss;
for(int i = 0; i < v.size(); ++i) {
uint64_t val = static_cast<uint64_t>(std::round(v.at(i)));
ss.write(const_cast<char*>(reinterpret_cast<const char*>(&val)), sizeof(val));
}
for(int i = 0; i < v.size(); ++i) {
uint64_t val;
ss.read(reinterpret_cast<char*>(&val), sizeof(val));
w.push_back(static_cast<double>(val));
};
std::cout<<w.at(2)<<std::endl;
return 0;
}
看起来非常简单,不确定您可能还期待什么。
请注意,将 double
转换为 uint64_t
可能会溢出。
在下面的玩具程序中,我使用 stringstream 写入和读取双精度向量。但是,我如何在 ss 中将 v 写为(舍入)uint 的向量,以便当 w 读取程序的输出是3?
#include <sstream>
#include <vector>
#include <iostream>
int main() {
std::vector<double> v = {0.1, 1.2, 2.6};
std::vector<double> w;
std::stringstream ss;
ss.write(const_cast<char*>(reinterpret_cast<const char*>(&v.at(0))), v.size() * sizeof(v.at(0))); // Here it should cast v first into uint an then into char
for(int i = 0; i < v.size(); ++i) {
double val; // It should be uint val
ss.read(reinterpret_cast<char*>(&val), sizeof(val));
w.push_back(val);
};
std::cout<<w.at(2)<<std::endl;
return 0;
}
假设您想像“从 x.5 向上取整”那样“取整”,您可以使用
std::cout<<(unsigned int)(w.at(2)+0.5)<<std::endl;
它使用 0.5 的偏移量来移动截断并根据需要进行四舍五入。
(在您显示的程序中使用这一行的)输出是
3
此代码读取向量,舍入值,然后一次写出一个值。从流中读回时相反。
#include <sstream>
#include <vector>
#include <iostream>
#include <cstdint>
#include <cmath>
int main() {
std::vector<double> v = {0.1, 1.2, 2.6};
std::vector<double> w;
std::stringstream ss;
for(int i = 0; i < v.size(); ++i) {
uint64_t val = static_cast<uint64_t>(std::round(v.at(i)));
ss.write(const_cast<char*>(reinterpret_cast<const char*>(&val)), sizeof(val));
}
for(int i = 0; i < v.size(); ++i) {
uint64_t val;
ss.read(reinterpret_cast<char*>(&val), sizeof(val));
w.push_back(static_cast<double>(val));
};
std::cout<<w.at(2)<<std::endl;
return 0;
}
看起来非常简单,不确定您可能还期待什么。
请注意,将 double
转换为 uint64_t
可能会溢出。