格式化输出到C ++ ostringstream对象

时间:2011-03-04 15:16:45

标签: c++

cout << setw(20) << setiosflags(std::ios_base::left) << stamp; // this is char stamp[200] dataype.
cout << setw(1)  << setiosflags(std::ios_base::left) << " ";
cout << setw(10) << setiosflags(std::ios_base::left) << appName1; // this is stl string data dtype
cout << setw(1)  << setiosflags(std::ios_base::left) << ":";
cout << setw(15) << setiosflags(std::ios_base::left) << myname; // this is stl string data type.
cout << setw(1)  << setiosflags(std::ios_base::left) << ":";    
cout << setw(10) << setiosflags(std::ios_base::left) << myotherappname; // this is stl string data type.
cout << endl;
cout << finallyMyMessage; // this is char finallyMyMessage[200]; 

现在我的要求是除了控制台之外还将上面格式化的文本放到文件中。我知道我们可以用ostringstream来做这件事,但是不能通过代码我们如何做到这一点。任何人都可以帮我提供一个示例代码,我们可以使用ostringstream如何做到这一点,以后我可以使用ostreamobject写入文件。

谢谢!

6 个答案:

答案 0 :(得分:4)

流是多态的。它们都来自一个共同的基类。该公共基类定义了大多数操作。派生类只是设置正确的流缓冲区。

所以多态地使用它们:

void write(std::ostream& os)
{
  os << setw(20) << setiosflags(std::ios_base::left) << stamp;
  os << setw(1)  << setiosflags(std::ios_base::left) << " ";
  os << setw(10) << setiosflags(std::ios_base::left) << appName1;
  os << setw(1)  << setiosflags(std::ios_base::left) << ":";
  os << setw(15) << setiosflags(std::ios_base::left) << myname;
  os << setw(1)  << setiosflags(std::ios_base::left) << ":";    
  os << setw(10) << setiosflags(std::ios_base::left) << myotherappname;
  os << endl;
  os << finallyMyMessage;
}

// ...

write(std::cout);

std::ostringstream oss;
write(oss);

std::ofstream ofs("file.txt");
write(ofs);

答案 1 :(得分:1)

您实际需要的是ofstream来写入文件。首先写入ostringstream然后将该字符串写入控制台和文件可能确实更快,但让我们从如何写入文件开始:

<击>

<击>
ostream& st = use_file? ofstream("output.txt"): cout;

<击>

ofstream st("output.txt");

st << setw(20) << setiosflags(std::ios_base::left) << stamp; // this is char stamp[200] dataype.
st << setw(1)  << setiosflags(std::ios_base::left) << " ";
st << setw(10) << setiosflags(std::ios_base::left) << appName1; // this is stl string data dtype
st << setw(1)  << setiosflags(std::ios_base::left) << ":";
st << setw(15) << setiosflags(std::ios_base::left) << myname; // this is stl string data type.
st << setw(1)  << setiosflags(std::ios_base::left) << ":";    
st << setw(10) << setiosflags(std::ios_base::left) << myotherappname; // this is stl string data type.
st << endl;
st << finallyMyMessage; // this is char finallyMyMessage[200]; 

答案 2 :(得分:1)

如果您有可用的提升,则可以使用boost format库:

#include <boost/format.hpp>

cout << format("%20s %10s %15s %10s") % stamp % appName1 % myname % myotherappname << endl;

您可以将输出发送到任何ostream派生类型。

答案 3 :(得分:1)

您可以使用操作系统执行此操作。

在unix上你有tee

./a.out | tee plop.txt

将输出转储到文件“plop.txt”和控制台。

答案 4 :(得分:0)

非常直白......

#include <sstream>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>

int main(int argc, char* argv[])
{
    std::ostringstream oss;

    // defined just so my example will compile
    std::string stamp, appName1, myname, myotherappname, finallyMyMessage;

    oss << std::setw(20) << std::setiosflags(std::ios_base::left) << stamp; // this is char stamp[200] dataype.
    oss << std::setw(1)  << std::setiosflags(std::ios_base::left) << " ";
    oss << std::setw(10) << std::setiosflags(std::ios_base::left) << appName1; // this is stl string data dtype
    oss << std::setw(1)  << std::setiosflags(std::ios_base::left) << ":";
    oss << std::setw(15) << std::setiosflags(std::ios_base::left) << myname; // this is stl string data type.
    oss << std::setw(1)  << std::setiosflags(std::ios_base::left) << ":";    
    oss << std::setw(10) << std::setiosflags(std::ios_base::left) << myotherappname; // this is stl string data type.
    oss << std::endl;
    oss << finallyMyMessage; // this is char finallyMyMessage[200]; 

    // ...

    std::ofstream outfile("something.txt");   // open a file for writing
    outfile << oss.str();  // output the ostringstream's string to the ofstream
    outfil.close();

    // or if you need a char*...
    std::string str(oss.str());

    usecharstar(str.c_str());

    return 0;
}

答案 5 :(得分:0)

您不必为每个输出重复左侧调整,它会粘在流上。

您也不必更改每个输出的宽度,因为它会为字段设置最小宽度。这使得宽度(1)对于单个字符输出完全没有意义。

这很容易。你只是太努力了!