繁体   English   中英

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

[英]formatted output to a C++ ostringstream object

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写入文件。

谢谢!

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

因此,多态使用它们:

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);

你真正需要的是一个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]; 

如果有可用的增强功能,则可以使用增强格式库:

#include <boost/format.hpp>

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

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

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

在Unix上,您有T恤

./a.out | tee plop.txt

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

真的很简单...

#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;
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM