问题标签 [manipulators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1591 浏览

c++ - iostream 限制要读取的最大字符数

在 Bruce Eckel “Thinking in C++”的帮助下学习 C++。陷入“Iostreams”一章的练习 05:

练习文本

我们知道 setw( ) 允许读取最少的字符,但是如果您想读取最多的字符怎么办?编写一个效应器,允许用户指定要提取的最大字符数。让您的效应器也用于输出,如果需要,输出字段会被截断,以保持在宽度限制内。

我了解如何创建不带参数和带参数的操纵器(在本书术语中称为效应器)。但是不明白如何限制要提取的最大字符数。std::ios_base::width指定最小字符数。

我应该对底层streambuf对象做一些技巧吗?

0 投票
2 回答
2489 浏览

c++ - 带有缩进的 c++ 自定义输出流

我在尝试实现自定义流类以在输出文件中生成很好的缩进代码时遇到了一些麻烦。我在网上进行了广泛的搜索,但似乎没有就实现这一目标的最佳方式达成共识。有些人谈论派生流,其他人谈论派生缓冲区,还有一些人建议使用语言环境/构面等。

本质上,我发现自己写了很多这样的代码:

当标签开始加起来时看起来很可怕,似乎有这样的东西会很好:

即创建一个派生流类,它会跟踪其当前的缩进深度,然后是一些操纵器来增加/减少缩进深度,以及一个操纵器来编写一个换行符,然后是许多制表符。

所以这是我实现类和操纵器的方法:

ind_ofstream.h

ind_ofstream.cpp

这会构建,但不会产生预期的输出;任何使用自定义操纵器的尝试都会导致它们由于某种原因被转换为布尔值并将“1”写入文件。我需要为我的新类重载 << 运算符吗?(我还没有找到一种可以构建的方法)

谢谢!

ps

1) 我从我的代码片段中省略了#includes、使用命名空间等以节省空间。

2)我的目标是能够使用类似于我的第二个代码片段中的界面。如果在阅读整篇文章后,您认为这是一个坏主意,请解释原因并提供替代方案。

0 投票
1 回答
639 浏览

c++ - 标准 C++ MoneyPunct / put_money 错误?

这些货币操纵者的文件似乎几乎为零。我试图通过反复试验来解决这个问题。考虑示例程序:

这段代码的问题是它打印出 12,345.67。这是非常糟糕的,因为它不仅丢失了小数,而且现在相差了 100 倍。我查看了 MSVC++ STL 实现并且非常困惑:

观察一个函数,它需要一个双精度,但有一个 sprintf 可以去掉所有小数。在我重新发明轮子之前,我想在这里获得 C++ 专家的意见。

0 投票
6 回答
41648 浏览

c++ - 使用 C++ 中的流操纵器在固定宽度字段中居中文本

我正在重构一些使用printflongs 字符串(没有任何实际格式)的遗留代码,以打印出在概念上看起来像这样的纯文本表标题:

目前正在像这样生产:

我想用代码生成上面的代码1

它不能编译,因为<iomanip>有流操纵器std::leftstd::right并且std::internal,但似乎没有std::center。在标准 C++ 库中是否已经有一种干净的方法可以做到这一点,还是我必须手动计算必要的间距?


1尽管这比 C 代码更冗长,但从长远来看,由于printf语句的数量和字符串中的中缀重复的数量,它会变得不那么冗长。它也将更具可扩展性和可维护性。

0 投票
2 回答
1061 浏览

c++ - 流操作符的模板类型推导

我不确定这段代码是否不会编译。

我正在使用的示例代码:

这是错误:

我很困惑为什么它不能用endl( ostream& (*)(ostream&))的函数类型代替T,当你指定时它显然可以这样做cout << endl;

我发现这解决了问题也令人费解[已编辑]

如果问题不清楚,我问为什么它不能首先推断出模板。

0 投票
2 回答
165 浏览

c++ - 重载 << 并定义流操纵器 C++

我希望有人可以就我遇到的特定问题提供一些见解。我正在编写一个程序,它接收整数,将它们存储在一个向量中,并用逗号分隔符将它们打印出来,用于大于 999 -> 1,000 的数字。

我的问题是……嗯,实际上有两个,我怎样才能将向量传递给函数,第二,如果我想重载 << 以在幕后完成所有这些工作,这可能吗?

逗号类的全局函数:

在 main() 中循环以显示向量:

0 投票
3 回答
401 浏览

c++ - 我对线程安全日志类的方法很糟糕吗?

我一直在寻找解决线程安全日志记录问题的各种方法,但我还没有看到像这样的东西,所以我不知道它是否有点糟糕,因为我是 C++ 的一个完整的新手,线程和 iostream。它似乎适用于我已经完成的基本测试。

基本上我有一个 Log 类(创意,我知道......),它为标准操纵器设置了 operator<<,所以我可以愉快地传递我想要的任何东西。

但是,我知道类似:

当多个线程写入 cout (或 Log ostream 指向的任何地方)时,可能会交错。因此,我创建了一些特定于 Log 类的操纵器,让我可以这样做:

我只是想知道这是否是一个天生糟糕的想法,记住我愿意接受 Log 类的用户需要接受“锁定”和“解锁”的约束。我考虑过让'std::endl'自动解锁,但这似乎会让人更头疼......我认为无论如何都应该在测试中出现无纪律的使用,但如果有人能看到一种方法来使这种使用导致编译-时间错误,那会很好。

对于让我的代码更简洁的任何建议,我也将不胜感激。

这是用于演示目的的类的精简版;整个事情还有更多的构造函数采用文件名之类的东西,因此与问题无关。

它适用于我在 Ubuntu 12.04 g++ 上,编译为:

与制作定制机械手相关的部分从这里被无耻地抄袭,但不要因为我无能的复制面而责怪他们。

0 投票
5 回答
315 浏览

c++ - 带有输出操纵器的 C++ int

我正在破坏我的大脑试图弄清楚这一点。请多多包涵,因为我才刚开始学习 C++ 的第四周。

当所有代码都在 main() 中时,下面的代码可以正常工作

但是我被要求让它工作,以便代码被拆分,但我似乎做不到。我的尝试如下。如果有人可以让我走上正确的轨道,那就太好了。请记住,我们还没有学到任何复杂的东西,所以它应该不难。

0 投票
2 回答
298 浏览

c++ - 如何使用这个机械手

这是针对学校的练习,因此请仅提供提示,不要提供完整示例;-)

我有自己的机械手:

我写了这个,因为我必须用表单编写一个操纵器ios_base& my_manip(basic_ios&)

如果我这样使用它(不使用返回值):

...效果很好。但如果我这样使用它:

这不起作用(因为 std::ios_base 没有 operator<<() 如下所述)。

一般来说,我没有得到什么ios_base& my_manip(basic_ios&)有用的……你有提示/例子吗?


你们已经帮了我很多了!我仍然不明白的是,通过 abasic_ios并回馈的动机ios_base(因为建议在我必须解决的练习中这样做......)。使用它的可能场景是什么???

0 投票
1 回答
80 浏览

c++ - 获取 std::flush 操纵器函数的地址不等于静态 const 变量中先前存储的地址

我正在开发一个重载流插入运算符的记录器类。我很难抓住std::flush机械手。

首先,快速总结一下我的工作:

给定一个对象LogClass,我想做以下事情:

...并抓住std::flush机械手。

所有输入都直接发送到内部字符串流,以便稍后通过以下内联运算符进行记录(工作正常):

我试图std::flush通过如下重载来捕获操纵器(这也可以正常工作):

如果我尝试将局部变量flushFunc设为静态,则问题显示如下:

在这种情况下,传入manip指针的值等于flushFunc

这是为什么?它与std::flush函数的模板实例化有什么关系char吗?

我正在使用 MS Visual Studio 2010 Pro。

这个问题也显示在这个小的工作代码片段中:

...在我的机器上给出了这个输出:

有任何想法吗?

最好的问候, Rein A. Apeland