obsługa strumieni c++ w c

0

Cześć,
Mam w swoim programie w c++ funkcje, które operują na strumieniach weśjścia/wyjścia. W skrócie użytkownik może przekazać np. wyjściowy strumień do którego mój program będzie zapisywał bieżące wyniki. Można też podać strumień wejściowy, z którego będą pobierane dane. Ostatnio wyszła potrzeba dopisania api C dla tych funkcji i stąd moje pytanie czy istnieje jakiś sposób, żeby z poziomu C przekazywać jakąś strukturę analogiczną do strumieni z c++? Doczytałem, że w c mamy coś takiego jak FILE* co jest właśnie czymś na kształt strumienia z C++ z tym, że nie znalazłem sposobu, żeby połączyć z sobą FILE* oraz strumieni z cpp. Ogólnie zależy mi żebym mógł zrobić coś w tym stylu:

// file my_lib.hpp
void write_to(std::ostream& stream)
{ 
  stream << "przykładowa funkcja pisząca do strumienia";
}

// file c_api.h
void c_write_to(FILE* stream);

//file c_api.cpp
#include "c_api.h"
#include "my_lib.hpp"

void c_write_to(FILE* stream)
{
  // i tutaj przydałaby się jakaś konwersja struktur C na C++
  //write_to();
}

Czy jest jakaś mozłiwość, żeby to wykonać w ten sposób? A może w ogóle mam złe podejście i można to zrobić prościej/lepiej?

Z góry dzięki za odpowiedź.

2

Co do użycia *FILE - nie widzę takiej możliwości, no chyba że użyjesz systemowego PIPE.
Zrobić coś a la strumień w C jest dosyć prosto ale nie łatwo zabezpieczyć jego zwolnienia w C.

1

Jeśli dobrze rozumiem - masz FILE * i chcesz z tego zrobić std::ostream żeby użyć funkcji w C++ ?
Jeśli nie przeszkadza Ci brak przenośności, to tu jest kilka sugestii: https://stackoverflow.com/questions/2746168/how-to-construct-a-c-fstream-from-a-posix-file-descriptor

0

Dzięki za odpowiedzi. Ogólnie to kod musi być wieloplatformowy, więc raczej użycie PIPEa odpoada. Nie wiem czy podejście z FILE* jest słuszne, więc jak co to nie trzeba się tago trzymać. Po prostu podczas mojeg researchu się na to natknąłem i stwierdziłem, że może da radę.

1

Jak o C jedyne co wiesz, to FILE *, to jeszcze niewiele, jest bardzo ciekawa i mocna grupa funckji z int filehandle io.h
Mam głębokie, głębokie przeczucie, że DA SIĘ to zrobić, fajnie definiując swój problem, ale MSZ nie za specjalnie sobie z definicją zagadnienia radzisz, a ukrywasz prawdziwe założenia.
*)

Ma marginesie:
Ponieważ w C nie ma dziedziczenia, a w C++ jest, da się w C++ napisać swój strumień, który będzie proxy / gatewayem do czegokolwiek (a nie będzie prostą warstwą nad systemowym plikiem, np fabryczny string stream) - odwrotnie, w C nie ma żadnego przenośnego sposobu "zrobić swój FILE" (i nie ma fabrycznego "string FILE")

Dawało się to robić (z milion lat temu) na konkretny kompilator (Borland Turbo C 16 bit, he, he, się robiło) i konkretny system. Ale totalnie to było nieprzenośne.

*) wszystko się teoretycznie da. Można gdzieś w C mieć void *, który kod C++ będzie umiał rzutować na stream itd ... Ostrożnie, bo kupę C++ nie jest "twardym" kodem w LIB, tylko inlinowana/templejtowana ... ale się by dało ...

0

Ja nadal nie do końca rozumiem problem.

Masz kod w C++ który używa std::istream i/lub std::ostream.

  1. Do tego kodu chcesz dołączyć bibliotekę napisaną w C, w której masz możliwość zdefiniowania callback-a akceptującego FILE* i potrzebujesz zrobić adapter do Twojego kodu. Całość skompilujesz jako aplikację C++. Do zrobienia bez większego problemu
  2. Masz aplikację w C i chcesz w niej skorzystać z kodu w C++ i całość skompilować jako aplikację C. Szkoda czasu
  3. Masz dwa oddzielne procesy (jeden to program napisany w C++, drugi to program napisany w C) i chcesz między nimi przesyłać dane - ale to problem kompletnie niezwiązany z stream/FILE*
1

Masz aplikację w C i chcesz w niej skorzystać z kodu w C++ i całość skompilować jako aplikację C. Szkoda czasu

Chyba, że to klient ma aplikację w C i potrzebuje mieć api C, żeby móc skorzystać z funkcjonalności mojej biblioteki napisanej w cpp. ;)

2
_dominik napisał(a):

Masz aplikację w C i chcesz w niej skorzystać z kodu w C++ i całość skompilować jako aplikację C. Szkoda czasu

Chyba, że to klient ma aplikację w C i potrzebuje mieć api C, żeby móc skorzystać z funkcjonalności mojej biblioteki napisanej w cpp. ;)

OK, czyli głównym problemem nie jest adapter do strumieni, tylko linkowanie kodu skompilowanego w C++ z kodem C

Masz tu sugestię: https://caiorss.github.io/C-Cpp-Notes/CwrapperToQtLibrary.html

2
_dominik napisał(a):

Masz aplikację w C i chcesz w niej skorzystać z kodu w C++ i całość skompilować jako aplikację C. Szkoda czasu

Chyba, że to klient ma aplikację w C i potrzebuje mieć api C, żeby móc skorzystać z funkcjonalności mojej biblioteki napisanej w cpp. ;)

To twoja biblioteka?
Niech pomyślę ... libka przewidziana do wysokiej przenośności, powinna mieć inaczej przecięcia (separacje części publicznej i prywatnej). Widziałem nieraz libki / moduły C-Python, C-Lua, to wieloletnie projekty, ale (hen kiedyś) wymagało minimum zastanowienia, co wystawić publicznie, a co zachować prywatnie.

Tam jak mówisz, to co z przemycenia jakiegoś C-proxy / innego C-oszustwa na C++stream, jak on go nie będzie mógł utworzyć (nie wykona kontruktora)
... da się łączyć C z C++, ale gdzieś są granice rozsądku.

PS. kolejny kolega w tych dniach, który z ukrywania i dawkowania na kroplówce informacji komplikuje proste rzeczy, do wielostronicowego wątku z ktorego nic nie wynika

1 użytkowników online, w tym zalogowanych: 0, gości: 1