标签: iomanip

如何使用cout打印0x0a而不是0xa?

如何使用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)

c++ io iostream iomanip

51
推荐指数
4
解决办法
5万
查看次数

std :: stringstream的小数点?

我有一堆整数,我把它放进去了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

c++ string floating-point stringstream iomanip

26
推荐指数
2
解决办法
5万
查看次数

"std :: cout << std :: endl;"怎么样?编译?

大多数IO流操纵器都是具有以下签名的常规函数​​:

std::ios_base& func( std::ios_base& str );
Run Code Online (Sandbox Code Playgroud)

但是,一些操纵器(包括最常用的操纵器 - std::endlstd::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.但是,管理该程序的规则是什么?对于重载分辨率来说,这似乎是一个真正的挑战,它必须同时回答两个问题:

  1. 哪个专业std::endl<CharT, Traits>() …

c++ templates overload-resolution iomanip

15
推荐指数
3
解决办法
1961
查看次数

用std :: cout正确地用0填充负整数

我发现这个问题已经问到了,但每个人给出的答案都是

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做?

c++ iostream cout iomanip

12
推荐指数
1
解决办法
1383
查看次数

我如何使用iomanip的setw,setfill和left/right?Setfill没有停止输出

我试图让我的输出看起来像这样:

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)

c++ setw iomanip

12
推荐指数
1
解决办法
4万
查看次数

如何使用AF(而不是af)传输十六进制数字?

是否可以ostream使用字符输出十六进制数字A-F而不是a-f

int x = 0xABC;
std::cout << std::hex << x << std::endl;
Run Code Online (Sandbox Code Playgroud)

这是输出,abc而我更愿意看到ABC.

c++ hex iostream iomanip

10
推荐指数
1
解决办法
275
查看次数

可以`std :: istream :: operator >>()`接受整数基数前缀,比如stdio的%i格式说明符吗?

当使用的scanf()和它的变体,该格式说明%i将接受作为十六进制数据(加前缀"0x"为),八进制(前缀"0"),或十进制(无前缀),因此,例如字符串"0x10的","020 "和"16"都转换为十进制值为16的整数.

这可以通过std::istream::operator>>格式化输入完成吗?

使用普通的>> i无I/O操纵器"为0x10"被转换成零(或者更确切地说,前导0,则"×10"的部分不被处理),以及"020",以20 hex,octdec操纵行为像%x,%o%d分别.我正在寻找一个像%i.一样的通用整数输入操纵器.

有趣的是,hex操纵器可能同时接受"0x10"和"10"转换为16位小数.

如果您可能想知道,我正在实现一个表达式求值程序,并且我希望使用C/C++前缀约定允许整数操作数为十六进制,八进制或十进制.当前使用的实现sscanf()会自动使用%i,我很好奇是否可以修改它以使用iostream而无需显式解析数字格式.

c++ scanf istream iomanip

10
推荐指数
1
解决办法
1120
查看次数

在cout中与`fixed`相反的是什么?

使用时cout,<iomanip>标题中定义的默认格式化程序是什么?换句话说,一旦我将格式化程序设置为fixed使用cout << fixed << setPrecision(2),我该如何更改它?或者,我将它改回来的什么?

c++ cout formatter iomanip

10
推荐指数
2
解决办法
8286
查看次数

你能把操纵器传递给一个函数吗?

我想将一个操纵器列表传递给一个函数,如下所示:

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)

我现在应该放弃,还是有办法做到这一点?

c++ iostream iomanip c++11

10
推荐指数
2
解决办法
1113
查看次数

cout << setw与åäö没有正确对齐

以下代码重现了我的问题:

#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)

为什么会这样?

c++ character-encoding iomanip c++11

10
推荐指数
2
解决办法
850
查看次数