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写入文件。
谢谢!
答案 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)对于单个字符输出完全没有意义。
这很容易。你只是太努力了!