您不能直接將FILE*
寫入流中。它會寫入一個內存地址而不是實際的文件內容,因此它不會給你想要的結果。
理想的解決方案是讀取ifstream
並寫入您的ofstream
,但無法從FILE*
構建ifstream
。
但是,我們可以擴展streambuf
類,使其工作在FILE*
之上,然後將其傳遞給istream
。快速搜索發現有人已經實施了該功能,並正確命名爲popen_streambuf
。見this specific answer。然後
您的代碼應該是這樣的:
std::ofstream output("triangulation/delaunayedpoints.txt");
popen_streambuf popen_buf;
if (popen_buf.open("qdelaunay < triangulation/rawpoints.txt", "r") == NULL) {
std::cerr << "Failed to popen." << std::endl;
return;
}
char buffer[256];
std::istream input(&popen_buf);
while (input.read(buffer, 256)) {
output << buffer;
}
output.close();
正如在評論中指出的Simon Richter,有一個operator<<
接受streambuf
和到達EOF,直到將數據寫入ostream
。這樣一來,代碼將被簡化爲:
std::ofstream output("triangulation/delaunayedpoints.txt");
popen_streambuf popen_buf;
if (popen_buf.open("qdelaunay < triangulation/rawpoints.txt", "r") == NULL) {
std::cerr << "Failed to popen." << std::endl;
return;
}
output << &popen_buf;
output.close();
注意,在你的榜樣,你也可以使用`輸出<<&popen_buf;`來複制數據,因爲有一個`運營商<<(STD :: ostream&,std :: streambuf *);`。 – 2011-01-20 11:36:47