Вы не можете написать FILE*
прямо в поток. Он будет записывать адрес памяти вместо фактического содержимого файла, поэтому он не даст желаемого результата.
Идеальным решением было бы читать из ifstream
и записать на свой ofstream
, но нет никакого способа, чтобы построить ifstream
из FILE*
.
Однако мы можем расширить класс 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
и записывает данные в ostream
до EOF не будет достигнута. Таким образом, код будет упрощено до:
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,' чтобы скопировать данные, так как есть 'оператор << (станд :: ostream &, std :: streambuf *); '. –
@ Симон Рихтер: О, я полностью пропустил это! Обновлено, чтобы упомянуть ваше предложение. Спасибо! – jweyrich