我正在使用命名管道创建模拟移动网络,以便在进程之间传输信息。我有想法创建一个框架类来保存我需要的数据,并将该框架的地址传递给管道。我唯一想要挽救生命的是如何将我的帧的地址转换为字符指针,以便将其传递给write()函数。这是我到目前为止的概述:
NFrame *frame = new NFrame;
// set frame information
char *f_address = (char*)(frame);
std::cout << f_address << std::cout;
每当我打电话给cout来验证我得到的地址都是不可读的字符。我和reinterpret_cast搞混了,我遇到了同样的情况。
我错过了什么,或者我是否正确行事。
答案 0 :(得分:1)
你可能想要的是serialization。通常优选(为了便于调试)以某种文本格式(如JSON)进行序列化。您可以使用JsonCPP之类的库。另请参阅s11n这是一个二进制序列化框架(但我推荐使用JSON)。
你通常不应该写一些复杂的C ++对象的原始内存字节,因为它们包含大多数其他程序和进程无法读取的数据(例如,指向你的进程的内部指针;在另一个运行甚至相同程序的进程中,它们由于ASLR),可能会有所不同。
(如果您确定它们是由同一个进程读取的话,您可以编写原始内存字节;但即使这对C ++程序也可能是错误的)
如果(例如出于调试目的)您只想显示某个堆分配对象的地址,您可以将其转换为(void*)
,如:
std::cout << "frame@" << (void*)frame << std::endl;
但是这样的地址(通常是hexa)不是很易读,当然也不会告诉你frame
的内部状态。
您可以定义(通过overloading the output <<
operator)您自己的输出<<
运算符,如
std::ostream& operator <<(std::ostream&, const NFrame&);
然后是代码std::cout << (*frame) << std::endl
当然,你可以用std::ofstream的某个实例替换std::cout
以输出到某个文件,或输出到字符串的某个std :: ostringstream实例。
答案 1 :(得分:0)
地址中会包含许多不可打印的字符。你可能想要的是将地址转换为原始字节,然后将其转换为十六进制字符串。
答案 2 :(得分:0)
那是因为cout
'认为'你传递的字符串是char *
。
试试这个:
std::cout << reinterpret_cast<void*>(f_address) << std::endl;