[英]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.