2011-03-04 73 views
0
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写入文件。格式化输出到C++ ostringstream对象

谢谢!

+1

恩,你应该考虑在格式化部分前后的'ostream'上调用'setf()'和'unsetf()',这比操纵器更容易消化为每个单词设置左对齐! – Nim 2011-03-04 15:45:27

回答

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); 
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; 
} 
+0

我可以使用上面的例如oss.string()来返回字符串,实际上我必须将格式化的字符串传递给将写入文件的库。库函数接受char *指针。 – venkysmarty 2011-03-04 15:31:13

+0

嗯,我不认为这行符合你的期望:'outfile << oss;' – Nim 2011-03-04 15:33:55

+0

@Nim:固定的。粗心在我的部分:) – luke 2011-03-04 15:38:45

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]; 
+1

umm ...什么时候对'ofstream(“output.txt”)的析构函数被调用 – Inverse 2011-03-04 18:33:30

+0

@Inverse:你是完全正确的,因为引用是非const的,临时不延长。而对const的引用不会有用。 – 2011-03-04 18:35:23

1

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

#include <boost/format.hpp> 

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

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

0

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

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

这很简单。你只是太努力了!

1

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

在Unix上你有发球

./a.out | tee plop.txt 

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