2012-09-25 41 views
0

假设我有与C语法打开传输内容到C++流

FILE* fp = fopen("whatever.txt", "w"); 
// Library function needs FILE* to work on 
libray_function(fp); 

// Now I'd like to copy the contents of file to std::cout 
// How??? 

fclose(fp); 

我希望能够在该文件中的内容复制在C++的ostream(如stringstream或文件甚至可能是std::cout)。我怎样才能做到这一点?

+0

出了什么问题'fread',并把数据成一个字符串? –

回答

0

先关闭它。

fclose(fp); 

然后再次打开

string line; 
ifstream myfile ("whatever.txt"); 
if (myfile.is_open()) 
{ 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     cout << line << endl; 
    } 
    myfile.close(); 
} 
+1

这是C++,你肯定几乎从不需要/想要使用'is_open','good'或'close',OP也不会说任何关于基于行的数据。另见[这个问题](http://stackoverflow.com/q/5605125/743214)。 –

+0

嗯....谢谢。我懂了。他不是要求基于行的数据... – shan

1

您已经打开文件进行写入。无论如何,你需要关闭它并重新打开它,不过,如果你愿意,你可以打开它(如果你愿意的话,可以作为一个流言蜚语)。那么这取决于你对性能的关心程度。如果你真的关心,你应该阅读块(一次至少512字节)。如果你不关心性能,你可以读一个字节,吐出一个字节。

3

你可以使用一个ifstreamrdbuf()

#include <fstream> 
#include <sstream> 

std::ifstream in("whatever.txt"); 
std::ostringstream s; 
s << in.rdbuf(); 

或:

std::ifstream in("whatever.txt"); 
std::cout << in.rdbuf(); 
+0

你确定这会工作吗? – PiotrNycz

+0

@PiotrNycz,是的。有没有理由认为它不会? – hmjd

+0

我认为它只适用于所有内容在streambuf中的stringstream。对于filebuf,我认为在缓冲区中并不常见的是说整个1GB文件......但我没有尝试。只是好奇你有任何链接描述这个'os << buf'运算符? – PiotrNycz