将C格式字符串转换为C++io操纵器
Convert C format string to C++ io manipulators
在C中,我使用printf("%+10.5d\n",x(;打印整数x.
我已经为C++io操纵器编写了一个小的测试用例,但输出有不同的格式:
#include <iostream>
#include <iomanip>
#include <cstdio>
int main(void)
{
int x = 3;
printf("%+10.5dn", x);
std::cout << std::showpos << std::setw(10) << std::setprecision(5) << x << std::endl;
return 0;
}
输出为:
./testcommand+00003+3
我这里缺少哪个io操纵器来获得与printf相同的输出?
std::setfill
http://www.cplusplus.com/reference/iostream/manipulators/setfill/
带有简短的if语句((x>0) ? "+" : "" )
因此:std::cout << ((x>0) ? "+" : "" ) << std::setfill('0') << std::setw(10) << std::setprecision(5) << x << std::endl;
使用boost::format,您可以以更简洁的格式获得您想要的内容。
http://www.boost.org/doc/libs/release/libs/format/doc/format.html
#include <boost/format.hpp>
int main(void)
{
int x = 3;
std::cout << boost::format("%+10.5d") % x << std::endl;
return 0;
}
对于sprintf功能,您可以将cout行更改为这样。
std::string x_string = boost::str(boost::format("%+10.5d") % x);
我能得到的最接近的是这个(注意std::internal
(:
#include <iostream>
#include <iomanip>
#include <cstdio>
int main(void)
{
int x = 3;
printf("%+10.5dn", x);
std::cout << std::setfill('0') << std::internal << std::showpos << std::setw(10) << std::setprecision(5) << x << std::endl;
return 0;
}
这仍然不太正确:
+00003
+000000003
但这是一个进步。
在这种特殊情况下,我认为这是不可能的,至少并非没有大量的工作。在C++中(与C不同(输出整数时会忽略precision
参数,因此仅使用操纵器无法获得所需效果(boost::format
也不支持(。你会可能必须格式化为字符串,然后在手动'0'
。
在过去,我有一个GB_Format
类(这是预名称空间天(,有点像boost::format
,但它确实支持所有Posix格式规范;以便"%.<i>n</i>d"
的工作,我不得不实施积分转换,而不是使用底层流转换。类似以下内容:
std::string
fmtInt( int value, int width, int precision )
{
unsigned work = (value < 0 ? -value : value);
std::string result;
while ( work != 0 || result.size() < precision ) {
result += "0123456789"[ work % 10 ];
work /= 10;
}
result += (value < 0 ? '-' : '+');
while ( result.size() < width ) {
result += ' ';
}
return std::string( result.rbegin(), result.rend() );
}
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- C++setiosflags函数操纵器-未确定的缩进
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- C++表达SFINAE和ostream操纵器
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 操纵安卓相机的深度图导致应用程序崩溃
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 在C++中返回 IO 对象的目的是什么?
- 如何键入用于const对象的自定义io操纵器
- 如何编码为像 STL IO 操纵器函数这样的样式?
- 用IO操纵器在十六进制中打印一个8位号码
- 将C格式字符串转换为C++io操纵器