标签: manipulators

重载处理std :: endl?

我想定义一个类,MyStream以便:

MyStream myStream;
myStream << 1 << 2 << 3 << std::endl << 5 << 6 << std::endl << 7 << 8 << std::endl;
Run Code Online (Sandbox Code Playgroud)

给出输出

[blah]123
[blah]56
[blah]78
Run Code Online (Sandbox Code Playgroud)

基本上,我想在前面插入一个"[blah]",然后在每次非终止 后插入std::endl

这里的困难不是逻辑管理,而是检测和重载处理std::endl.有一种优雅的方式来做到这一点?

谢谢!

编辑:我不需要有关逻辑管理的建议.我需要知道如何检测/过载打印std::endl.

c++ iostream overloading manipulators endl

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

C++ - 如何重置输出流操纵器标志

我有一行代码在我的输出中将填充值设置为' - '字符,但需要将setfill标志重置为其默认的空白字符.我怎么做?

cout << setw(14) << "  CHARGE/ROOM" << endl;
cout << setfill('-') << setw(11) << '-' << "  " << setw(15) << '-' << "   " << setw(11) << '-' << endl;
Run Code Online (Sandbox Code Playgroud)

我认为这可行:

cout.unsetf(ios::manipulatorname) // Howerver I dont see a manipulator called setfill
Run Code Online (Sandbox Code Playgroud)

我走错了路吗?

c++ manipulators

17
推荐指数
3
解决办法
2万
查看次数

使用C++中的流操作符在固定宽度字段中居中文本

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

|  Table   |  Column  | Header  |
Run Code Online (Sandbox Code Playgroud)

目前正在制作如下:

printf("|  Table   |  Column  | Header  |");
Run Code Online (Sandbox Code Playgroud)

我想生成上面的代码,效果为1:

outputStream << "|" << std::setw(10) << std::center << "Table"
             << "|" << std::setw(10) << std::center << "Column"
             << "|" << std::setw(9) << std::center << "Header"
             << "|" << std::endl;
Run Code Online (Sandbox Code Playgroud)

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


1 即使这比C代码更冗长,但由于printf语句数量和字符串中不加重复的数量,从长远来看它将更加冗长.它也将更具可扩展性和可维护性.

c++ string stringstream ostream manipulators

13
推荐指数
3
解决办法
2万
查看次数

如何使用操纵器使用填充左零来格式化我的十六进制输出

下面的小测试程序打印出:

并且SS编号IS = 3039

我希望用左边填充的零打印出数字,使总长度为8.所以:

并且SS编号IS = 00003039(注意留下的额外零填充)

我想知道如何使用操纵器和字符串流来完成此操作,如下所示.谢谢!

测试程序:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

int main()
{

    int i = 12345;
    std::stringstream lTransport;

    lTransport << "And SS Number IS =" << std::hex << i << '\n';

    std::cout << lTransport.str();

}
Run Code Online (Sandbox Code Playgroud)

c++ manipulators

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

ostream showbase对于零值不显示"0x"

PSPS :( 一个预先编写脚本的脚本)
刚刚想到一个更有先见之明的问题包括以下概念:这是否为零值整数的非显示"0x"(showbase)是标准行为,或者这只是我的MinGW实施的一个怪癖?

这一切都是在一个愉快的星期天早上开始的......我想以十六进制表示形式转储一些Handles,并采用一致的格式化方式.
我想要一个前导0x和一个固定宽度,但事实证明这是使用预期的流操纵器难以捉摸的.
我发现这样做的唯一方法是将Handles强制转换为unsigned long.这似乎有点不合理,我希望我不是唯一一个想要这个的人......
在标准六角形机械手中遗漏了什么?是因为类型void*(HANDLE)只是在ostream的正常十六进制处理之外定义?

总结:我不想将HANDLE强制转换为不是的东西.
我不想硬编码"0x"前缀.有没有办法使用标准操纵器?还是我需要重载ostream对HANDLE的处理?(但这可能使我超负荷!)

这是我的测试代码(及其输出).
我用过'.' 作为填充字符,为清楚起见,(我实际上将使用'0')

HANDLE h; 
ULONG ul; 
int iH = sizeof(h); // how many bytes to this void* type.
int iW = iH*2;      // the max number of hex digits (width).
int iW2= iW+2;      // the max number of hex digits (+ 2 for showbase "0x").
int iX = 4;         // the number of bits per hex digit.
int …
Run Code Online (Sandbox Code Playgroud)

c++ formatting stream manipulators

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

std :: function作为自定义流操纵器

我正在尝试使用C++ 11功能来使自定义流操纵器更容易创建.我可以使用lambda函数作为操纵符,但不是std::function<ostream&(ostream&)>.

这是代码,归结为:

#include <iostream>
#include <functional>
using namespace std;

auto lambdaManip = [] (ostream& stream) -> ostream& {
    stream << "Hello world" << endl;
};
function<ostream& (ostream&)> functionManip = [] (ostream& stream) -> ostream& {
    stream << "Hello world" << endl;
};

int main (int argc, char** argv) {
    cout << lambdaManip;    // OK
    cout << functionManip;  // Compiler error
}
Run Code Online (Sandbox Code Playgroud)

第二个cout语句失败,并带有以下内容:

g++-4 src/Solve.cpp -c -g -std=c++0x -o src/Solve.o -I/home/ekrohne/minisat
src/Solve.cpp: In function 'int main(int, …
Run Code Online (Sandbox Code Playgroud)

c++ lambda iostream manipulators c++11

9
推荐指数
3
解决办法
1687
查看次数

应该std :: ws在文件末尾提出failbit吗?

应该使用std :: ws操纵器从流中提取是否会引发失败位?在以下代码中,Clang编译(在Xcode 4.5.1中)程序未通过最终断言.显然s >> std::ws,EOF会导致失败.然而,GCC 4.7.2通过了断言.哪个是对的?

#include <iostream>
#include <sstream>
#include <cassert>

int main(int argc, const char * argv[])
{
    {
        // Read string with trailing ws.
        std::istringstream s( "test   " );
        std::string test;

        s >> std::ws;
        assert( !s.fail() );    // No ws to skip, but no failure.

        s >> test;
        assert( test == "test" );
        assert( !s.fail() );

        s >> std::ws;
        assert( !s.fail() );    // No prob skipping trailing ws.
    }
    {
        // Retry with …
Run Code Online (Sandbox Code Playgroud)

c++ gcc iostream clang manipulators

9
推荐指数
1
解决办法
494
查看次数

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

我在尝试实现自定义流类以在输出文件中生成漂亮的缩进代码时遇到了一些麻烦.我在网上广泛搜索,但似乎没有就实现这一目标的最佳方式达成共识.有些人谈论派生流,其他人谈论推导缓冲,而其他人建议使用locales/facets等.

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

ofstream myFile();
myFile.open("test.php");
myFile << "<html>" << endl <<
          "\t<head>" << endl <<
          "\t\t<title>Hello world</title>" << endl <<
          "\t</head>" << endl <<
          "</html>" << endl;
Run Code Online (Sandbox Code Playgroud)

当标签开始加起来时,它看起来很糟糕,看起来像这样的东西会很好:

ind_ofstream myFile();
myFile.open("test.php");
myFile << "<html>" << ind_inc << ind_endl <<
          "<head>" << ind_inc << ind_endl <<
          "<title>Hello world</title>" << ind_dec << ind_endl <<
          "</head>" << ind_dec << ind_endl <<
          "</html>" << ind_endl;
Run Code Online (Sandbox Code Playgroud)

即创建一个派生流类,它将跟踪其当前的缩进深度,然后一些操纵器增加/减少缩进深度,一个操纵器编写一个换行符,然后是多个标签.

所以这是我实现类和操纵器的镜头:

ind_ofstream.h

class ind_ofstream : public ofstream
{
    public:
        ind_ofstream();
        void incInd();
        void decInd();
        size_t getInd();

    private:
        size_t …
Run Code Online (Sandbox Code Playgroud)

c++ stl derived stream manipulators

9
推荐指数
1
解决办法
2084
查看次数

具有参数的流操纵器如何工作?

在Stroustrup的C++书中,有一个自定义操纵器采用参数的例子(请参阅附带的代码).我对如何创建结构感到困惑.特别是,看起来"smanip"的构造函数有两个int参数,一个用于函数指针"ff",一个用于"ii".我不明白如何通过使用传递int参数来创建结构:

cout << setprecision(4) << angle;
Run Code Online (Sandbox Code Playgroud)

另外,调用这些函数的顺序是什么,以及如何确定类型参数Ch和Tr?非常感谢.

// manipulator taking arguments
struct smanip{
    iso_base& (*f) (ios_base&, int);
    int i;
    smanip(ios_base& (*ff)(ios_base&, int), int ii) : f(ff), i(ii){}
};

template<cladd Ch, class Tr>
ostream<Ch, Tr>& operator<<(ostream<Ch, Tr>& os, smanip& m){
    return m.f(os, m.i);
}

ios_base& set_precision(ios_base& s, int n){
    return s.setprecision(n); // call the member function
}

inline smanip setprecision(int n){
    return smanip(set_precision,n);
}

// usage:
cout << setprecision(4) << angle;
Run Code Online (Sandbox Code Playgroud)

c++ stream manipulators

8
推荐指数
2
解决办法
2783
查看次数

noskipws对cin的影响>>

据我所知,提取运算符在开始时跳过空白,并在遇到空白或流结束时停止.noskipws可用于停止忽略前导空格.

我有以下程序,我使用过noskipws.

#include <iostream>
using namespace std;

int main()
{
    char name[128];

    cout<<"Enter a name ";
    cin>>noskipws>>name;
    cout<<"You entered "<<name<<"\n";

    cout<<"Enter another name ";
    cin>>name;
    cout<<"You entered "<<(int)name[0]<<"\n";

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

我的疑问是:

  1. 如果我输入"John"作为第一个输入,那么第二个cin >>操作不会等待输入,也不会将任何内容复制到目标,即名称数组.我希望第二个cin >>至少传输一个换行符或者一个换行符,而不是仅仅将目标字符串设置为空.为什么会这样?

  2. 当我输入"John Smith"作为第一个cin >>语句的输入时,会观察到同样的事情.为什么第二个cin >>语句没有将空格或"Smith"复制到目标变量?

以下是该计划的输出:

Enter a name John
You entered John
Enter another name You entered 0


Enter a name John Smith
You entered John
Enter another name You entered 0
Run Code Online (Sandbox Code Playgroud)

谢谢!!!

c++ stream manipulators

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