Вы не можете записать FILE*
непосредственно в поток. Он будет записывать адрес памяти вместо фактического содержимого файла, поэтому он не даст вам желаемого результата.
Идеальным решением было бы чтение из ifstream
и запись в ваш ofstream
, но нет способа построить ifstream
из FILE*
.
Однако мы можем расширить класс streambuf
, заставить его работать над FILE*
, а затем вместо этого передать его istream
. Быстрый поиск показал, что кто-то уже реализовал это и правильно назвал popen_streambuf
. См этот конкретный ответ .
Ваш код будет выглядеть так:
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();
Как указывает Саймон Рихтер в комментариях, есть 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();