如何使用cout打印0x0a而不是0xa?
#include <iostream>
using std::cout;
using std::endl;
using std::hex;
int main()
{
cout << hex << showbase << 10 << endl;
}
Run Code Online (Sandbox Code Playgroud) 我有一堆整数,我把它放进去了stringstream.现在我想将stringstreams改为strings,同时保持s的恒定精度string.我该怎么办?我知道我可以使用stringstreams.precision(),但由于某些原因它不起作用:
float a = 5.23;
float b = 3.134;
float c = 3.0;
std::stringstream ta;
std::stringstream tb;
std::stringstream tc;
ta << a;
tb << b;
tc << c;
ta.precision(2);
tb.precision(2);
tc.precision(2);
std::string out = "";
out += ta.str() + "\n";
out += tb.str() + "\n";
out += tc.str() + "\n";
Run Code Online (Sandbox Code Playgroud)
会回来5.23\n3.134\n3.0,而不是5.23\n3.13\n3.00
大多数IO流操纵器都是具有以下签名的常规函数:
std::ios_base& func( std::ios_base& str );
Run Code Online (Sandbox Code Playgroud)
但是,一些操纵器(包括最常用的操纵器 - std::endl和std::flush)是以下形式的模板:
template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& func(std::basic_ostream<CharT, Traits>& os);
Run Code Online (Sandbox Code Playgroud)
然后,如果std::cout << std::endl;以下示例失败,如何编译成功:
$ cat main.cpp
#include <iostream>
int main()
{
auto myendl = std::endl;
std::cout << myendl;
}
$ g++ -std=c++11 main.cpp -o main
main.cpp: In function ‘int main()’:
main.cpp:5:24: error: unable to deduce ‘auto’ from ‘std::endl’
auto myendl = std::endl;
^
Run Code Online (Sandbox Code Playgroud)
很明显,上下文(in std::cout << std::endl;)有助于编译器消除对引用的歧义std::endl.但是,管理该程序的规则是什么?对于重载分辨率来说,这似乎是一个真正的挑战,它必须同时回答两个问题:
std::endl<CharT, Traits>() …我发现这个问题已经问到了,但每个人给出的答案都是
std::cout << std::setw(5) << std::setfill('0') << value << std::endl;
Run Code Online (Sandbox Code Playgroud)
这对于正数很好,但是对于-5,它会打印:
000-5
Run Code Online (Sandbox Code Playgroud)
有没有办法让它打印-0005或强制cout始终打印至少5位数(这将导致-00005),因为我们可以用printf做?
我试图让我的输出看起来像这样:
size time1 time2
-------------------------------
10 4 8
100 48 16
1000 2937 922
10000 123011 3902
100000 22407380 830722
Run Code Online (Sandbox Code Playgroud)
我知道我需要使用setw(),setfill()和left.但是,我的尝试一直给我不正确的输出.这是我的代码的一个例子:
std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2\n";
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
for(int i = 0; i < 5; i++) {
std::cout << run;
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << …Run Code Online (Sandbox Code Playgroud) 是否可以ostream使用字符输出十六进制数字A-F而不是a-f?
int x = 0xABC;
std::cout << std::hex << x << std::endl;
Run Code Online (Sandbox Code Playgroud)
这是输出,abc而我更愿意看到ABC.
当使用的scanf()和它的变体,该格式说明%i将接受作为十六进制数据(加前缀"0x"为),八进制(前缀"0"),或十进制(无前缀),因此,例如字符串"0x10的","020 "和"16"都转换为十进制值为16的整数.
这可以通过std::istream::operator>>格式化输入完成吗?
使用普通的>> i无I/O操纵器"为0x10"被转换成零(或者更确切地说,前导0,则"×10"的部分不被处理),以及"020",以20 hex,oct和dec操纵行为像%x,%o并%d分别.我正在寻找一个像%i.一样的通用整数输入操纵器.
有趣的是,hex操纵器可能同时接受"0x10"和"10"转换为16位小数.
如果您可能想知道,我正在实现一个表达式求值程序,并且我希望使用C/C++前缀约定允许整数操作数为十六进制,八进制或十进制.当前使用的实现sscanf()会自动使用%i,我很好奇是否可以修改它以使用iostream而无需显式解析数字格式.
使用时cout,<iomanip>标题中定义的默认格式化程序是什么?换句话说,一旦我将格式化程序设置为fixed使用cout << fixed << setPrecision(2),我该如何更改它?或者,我将它改回来的是什么?
我想将一个操纵器列表传递给一个函数,如下所示:
void print(const vector<std::smanip>& manips) {
// ...
for (auto m : manips)
cout << m;
// ...
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,这将通过以下代码调用:
some_object.print({std::fixed, std::setprecision(2)}));
Run Code Online (Sandbox Code Playgroud)
g ++ 4.7.0说:
error: ‘std::smanip’ has not been declared
Run Code Online (Sandbox Code Playgroud)
显然,smanip标准中并没有真正定义,C++ 11编译器不需要为操纵器类型提供显式名称.我尝试通过从一个已知的操纵器中取出来声明一个类型,如下所示:
typedef decltype(std::fixed) manip;
Run Code Online (Sandbox Code Playgroud)
这打开了一系列新的错误消息,包括这一消息:
error: ‘const _Tp* __gnu_cxx::new_allocator< <template-parameter-1-1>
>::address(__gnu_cxx::new_allocator< <template-parameter-1-1> >::const_reference)
const [with _Tp = std::ios_base&(std::ios_base&); __gnu_cxx::new_allocator<
<template-parameter-1-1> >::const_pointer = std::ios_base& (*)(std::ios_base&);
__gnu_cxx::new_allocator< <template-parameter-1-1> >::const_reference =
std::ios_base& (&)(std::ios_base&)]’ cannot be overloaded
Run Code Online (Sandbox Code Playgroud)
我现在应该放弃,还是有办法做到这一点?
以下代码重现了我的问题:
#include <iostream>
#include <iomanip>
#include <string>
void p(std::string s, int w)
{
std::cout << std::left << std::setw(w) << s;
}
int main(int argc, char const *argv[])
{
p("COL_A", 7);
p("COL_B", 7);
p("COL_C", 5);
std::cout << std::endl;
p("ABC", 7);
p("ÅÄÖ", 7);
p("ABC", 5);
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
COL_A COL_B COL_C
ABC ÅÄÖ ABC
Run Code Online (Sandbox Code Playgroud)
如果我将代码中的"ÅÄÖ"更改为例如"ABC",那么它的工作原理如下:
COL_A COL_B COL_C
ABC ABC ABC
Run Code Online (Sandbox Code Playgroud)
为什么会这样?