cppreference页面上std::setbase写着:
除8,10或16之外的基数值将基址重置为零,这对应于十进制输出和前缀相关的输入.
怎么会?
有没有特别的理由为什么只支持这些基地?至少支持16到16(实际上,高达36:0-9然后是az)的任何东西似乎微不足道,而不必做出任何困难的选择.具体来说,2是一个受欢迎的基础,我认为应该有兴趣std::setbase(2)(和相应的std::binary).
我显然可以打印自己的位,但对我的ostream来说这样做会很好.
我对头文件中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_money,std::get_time,和std::put_time。
实际使用的例子有哪些?
我很难对齐十进制值。我很确定它是右对齐和 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) 我打算将结束使用该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) 我正在做一个学校项目,我需要经常更改文本颜色.项目目标是目前仅适用于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) 这段代码印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) 在返回"默认格式"的意义上,我遇到浮点值的格式问题.说我有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) 我一直发现 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.
如何在没有填充的情况下设置精度?
我想在 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) 我正在使用犰狳线性代数库来对角化矩阵。我需要增加最后显示/写入文件的位数。根据犰狳的参考资料,“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)