我有char*,它的宽度是固定的(已知),但不是以null结尾的。
我想把它传递给LOG4CPLUS_ERROR("Bad string " << char_pointer);,但是因为它不是以null结尾的,所以它将全部打印出来。
有什么建议可以在不执行复制的情况下获得"(char[length])*char_pointer"的轻量级方法吗?
发布于 2011-04-05 21:32:17
真正的iostream%s
当你在写一个真正的iostream时,你可以只使用ostream.write(),它接受一个char*和一个大小来表示要写入的字节数--不需要空终止。(实际上,字符串中的任何空字符都将写入ostream,并且不会用于确定大小。)
日志库
在一些日志库中,您写入的流不是真正的iostream。在Log4CPP中就是这种情况。
但是,在Log4CPlus中,您要写入的对象是一个std::basic_ostringstream<tchar> (有关定义,请参阅loggingmacros.h和streams.h,因为从文档中看不出这一点)。只有一个问题:在宏LOG4CPLUS_ERROR中,第一个<<已经内置到宏中,所以他不能调用LOG4CPLUS_ERROR(.write(char_pointer,length))或类似的东西。不幸的是,如果不解构LOG4CPLUS_ERROR error宏并深入了解Log4CPlus的内部结构,我找不到解决这个问题的简单方法
解决方案
我不知道为什么在这一点上要尽量避免复制字符串,因为您可以看到在日志记录库中正在进行大量的复制。任何试图避免额外字符串复制的尝试都可能是不必要的优化。
我假设这是一个代码整洁的问题,也许是一个确保复制发生在LOG4CPLUS_ERROR宏内的问题,而不是在它之外的问题。在这种情况下,只需使用:
LOG4CPLUS_ERROR("Bad string " << std::string(char_pointer, length));发布于 2011-04-05 20:37:22
不,您必须进行深度复制并将其空终止。该代码需要一个以null结尾的字符串,它表示以null结束符结尾的连续字符块。
发布于 2011-04-05 20:38:32
如果您的目标是打印这样的字符串,您可以:
将所有这些都封装在一个函数中。
https://stackoverflow.com/questions/5551874
复制相似问题