标签: iomanip

为什么std :: setbase(2)没有切换到二进制输出?

cppreference页面上std::setbase写着:

除8,10或16之外的基数值将基址重置为零,这对应于十进制输出和前缀相关的输入.

怎么会?

有没有特别的理由为什么只支持这些基地?至少支持16到16(实际上,高达36:0-9然后是az)的任何东西似乎微不足道,而不必做出任何困难的选择.具体来说,2是一个受欢迎的基础,我认为应该有兴趣std::setbase(2)(和相应的std::binary).

我显然可以打印自己的位,但对我的ostream来说这样做会很好.

c++ base ostream c++-standard-library iomanip

6
推荐指数
2
解决办法
1190
查看次数

在C ++中对std :: get_money和s​​td :: put_money的困惑

我对头文件中std::get_money定义的C ++函数感到困惑<iomanip>get_money按编程概念的用途是什么?

我使用以下代码std::get_money

#include <iostream>     // std::cin, std::cout
#include <iomanip>      // std::get_money

int main ()
{
  long double price;
  std::cout << "Please, enter the price: ";
  std::cin >> std::get_money(price);

  if (std::cin.fail()) std::cout << "Error reading price\n";
  else std::cout << "The price entered is: " << price << '\n';

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我输入100.25时,它返回100。输出和货币格式之间是什么关系?我阅读了参考资料,但无法理解这种关系。同样的困惑存在与std::put_moneystd::get_time,和std::put_time

实际使用的例子有哪些?

c++ iomanip

6
推荐指数
1
解决办法
238
查看次数

C++ cout 小数对齐

我很难对齐十进制值。我很确定它是右对齐和 set precision/fixed 的组合,但它似乎不起作用。我知道有人就该主题提出了其他问题,但我还没有找到一个明确的解决方案来获取一堆列(要对齐的独特 cout 语句)。

这是我的代码的一部分:

double total_collect, sales, country_tax, state_tax, total_tax;
const double STATE_TAX_RATE = 0.04, COUNTRY_TAX_RATE = 0.02; 

// Compute taxes
total_collect = 100;
sales = 100 / 1.06 ;
country_tax = sales * COUNTRY_TAX_RATE;
state_tax = sales * STATE_TAX_RATE;
total_tax = country_tax + state_tax;

//Display

cout << setiosflags(std::ios::right) ;

cout << "Totla Collected: " << setw(7) << "$ " << fixed << setprecision(2) << right << total_collect << endl;
cout << "Sales: " << setw(17) << …
Run Code Online (Sandbox Code Playgroud)

c++ decimal fixed alignment iomanip

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

在 C++ 中重置输出标志

我打算将结束使用该resetiosflags函数的行上的所有输出标志重置为默认值。当我尝试以这种方式执行此操作时,它会提供错误的输出,这与我的预期相反。

#include <iostream>
#include <iomanip>
using namespace std;
int
main()
{
    bool first;
    int second;
    long third;
    float fourth;
    float fifth;
    double sixth;

    cout << "Enter bool, int, long, float, float, and double values: ";
    cin >> first >> second >> third >> fourth >> fifth >> sixth;
    cout << endl;

// ***** Solution starts here ****
    cout << first << " " << boolalpha << first  << endl << resetiosflags;
    cout << second << " " << …
Run Code Online (Sandbox Code Playgroud)

c++ flags iostream iomanip

5
推荐指数
1
解决办法
2216
查看次数

如何使我的函数粘滞为重载的iostream提取操作符

我正在做一个学校项目,我需要经常更改文本颜色.项目目标是目前仅适用于Windows的控制台应用.将代码块与MinGW一起使用进行调试.我不是菜鸟,但是中级.

所以在代码中无处不在使用它是丑陋的:

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), __col._colour_code);
Run Code Online (Sandbox Code Playgroud)

即使我把它包装在一个函数中,它仍然很麻烦和丑陋,因为你不能继续你的cout链.你必须打破链条,因为你必须SetColour在一个新的声明中调用,例如:

SetColour(GRAY);   cout << setcol(PURPLE) << " ID:[";
SetColour(AQUA);   cout << song.GetID();
SetColour(GRAY);   cout << "]" << " ";
SetColour(GREEN);  cout << song.GetTitle();
SetColour(WHITE);  cout << " by ";
SetColour(BRIGHT); cout << song.GetArtist() << "\n";
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的功能setw,setprecision等于是我打开了iomainp.h,并找了一些提示:

struct _Setw { int _M_n; };

inline _Setw 
setw(int __n)
{ return { __n }; }

template<typename _CharT, typename _Traits>
inline basic_istream<_CharT, _Traits>& 
operator>>(basic_istream<_CharT, _Traits>& __is, _Setw __f)
{
  __is.width(__f._M_n);
  return __is; …
Run Code Online (Sandbox Code Playgroud)

c++ windows console iomanip

5
推荐指数
1
解决办法
246
查看次数

使用std :: hexfloat进行读写

这段代码印0在我的机器上,但我预料到了0.3.怎么了?我在最新的Arch Linux上使用g ++ 6.3.1.编译标志似乎无关紧要.

#include <iostream>
#include <sstream>
int main() {
    std::stringstream s;
    s << std::hexfloat << 0.3 << std::endl;
    double d = -1.0;
    while(s >> std::hexfloat >> d)
        std::cout << d << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ floating-point iostream iomanip

5
推荐指数
1
解决办法
435
查看次数

格式化浮点数:返回默认值

在返回"默认格式"的意义上,我遇到浮点值的格式问题.说我有2个花车:

float f1 = 3.0f, f2 = 1.5f;
std::cout << f1 << " - " << f2 << "\n";
Run Code Online (Sandbox Code Playgroud)

将这些显示为: 3 - 1.5

现在,出于某种原因,我需要设置精度std::cout(用于其他打印):

cout << std::precision(2);
Run Code Online (Sandbox Code Playgroud)

如果我再次打印我的两个花车,这将导致: 3.00 - 1.50

现在我想恢复默认格式.直到C++ 11,这似乎很难(或者是它?).但是,谢谢,我现在得到了这个新标志: std :: defaultfloat.我们试试吧:

std::cout << std::defaultfloat << f1 << " - " << f2;
Run Code Online (Sandbox Code Playgroud)

将打印:3 - 1.50.精细.

哦,等等.说我有:

float f1 = 444.0f, f2 = 444.5f;
Run Code Online (Sandbox Code Playgroud)

默认打印将显示: 444 - 444.5

设定精度(和"固定"):

cout << std::precision(2) << std::fixed;
Run Code Online (Sandbox Code Playgroud)

将会呈现: 444.00 - 444.50

但回到"默认":

std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point precision iomanip

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

std::setprecision 设置有效数字的数量。如何使用 iomanip 设置精度?

我一直发现 iomanip 令人困惑和反直觉。我需要帮助。

快速互联网搜索发现(https://www.vedantu.com/maths/precision)“因此,我们将精度视为十进制数中小数点有效数字的最大数量”(重点是我的)。这也符合我的理解。但是我写了一个测试程序并且:

stm << std::setprecision(3) << 5.12345678;
std::cout << "5.12345678: " << stm.str() << std::endl;
stm.str("");

stm << std::setprecision(3) << 25.12345678;
std::cout << "25.12345678: " << stm.str() << std::endl;
stm.str("");

stm << std::setprecision(3) << 5.1;
std::cout << "5.1: " << stm.str() << std::endl;
stm.str("");
Run Code Online (Sandbox Code Playgroud)

输出:

5.12345678: 5.12
25.12345678: 25.1
5.1: 5.1
Run Code Online (Sandbox Code Playgroud)

如果精度为 3,则输出应为:

5.12345678: 5.123
25.12345678: 25.123
5.1: 5.1
Run Code Online (Sandbox Code Playgroud)

显然,C++ 标准对与浮点数相关的“精度”的含义有不同的解释。

如果我做:

stm.setf(std::ios::fixed, std::ios::floatfield);
Run Code Online (Sandbox Code Playgroud)

然后前两个值的格式正确,但最后一个值显示为5.100.

如何在没有填充的情况下设置精度?

c++ iomanip

5
推荐指数
1
解决办法
138
查看次数

如何打印一堆具有相同格式的整数?

我想在 2 个字段上打印一堆整数作为'0'填充字符。我可以做到,但会导致代码重复。我应该如何更改代码以便消除代码重复?

#include <ctime>
#include <sstream>
#include <iomanip>
#include <iostream>

using namespace std;

string timestamp() {

    time_t now = time(0);

    tm t = *localtime(&now);

    ostringstream ss;

    t.tm_mday = 9; // cheat a little to test it
    t.tm_hour = 8;

    ss << (t.tm_year+1900)
       << setw(2) << setfill('0') << (t.tm_mon+1) // Code duplication
       << setw(2) << setfill('0') <<  t.tm_mday
       << setw(2) << setfill('0') <<  t.tm_hour
       << setw(2) << setfill('0') <<  t.tm_min
       << setw(2) << setfill('0') <<  t.tm_sec;

    return ss.str(); …
Run Code Online (Sandbox Code Playgroud)

c++ code-duplication iomanip c++11

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

如何增加使用犰狳库时显示的位数

我正在使用犰狳线性代数库来对角化矩阵。我需要增加最后显示/写入文件的位数。根据犰狳的参考资料,“arma::mat”将创建一个双矩阵。所以,我尝试使用来自“iomanip”的 std::setprecision,但它并没有完全奏效。这是捕获问题的最小代码:

#include<iostream>
#include<armadillo>
#include<iomanip>

int main()
{
   double Trace_A = 0.;
   arma::mat A;
   A = :arma::randu<arma::mat>(5,5);
   Trace = arma::trace(A);         

   // Normal output
   std::cout << "A = \n" <<A ;
   std::cout << "Trace(A) = " << Trace_A << std::endl;
   std::cout << "---------------------------------------------" << std::endl;

   // Displaying more digits
   std::cout << std::fixed << std::setprecision(15);
   std::cout << "A = \n" << A;
   std::cout << "Trace(A) = " << Trace_A << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

而且,这是我得到的:

A = 
   0.8402   0.1976   0.4774   0.9162   0.0163 …
Run Code Online (Sandbox Code Playgroud)

c++ armadillo iomanip

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