2017-01-25 1 views
2

어떻게하면 C 파일에서 C++ streambuf 개체를 가져 와서 FILE 개체의 버퍼를 사용하여 동일한 기본 파일을 가리키는 동안 두 개체가 별도의 버퍼를 관리하지 않도록 할 수 있습니다.FILE 개체가 가리키는 버퍼 (및 버퍼 상태)를 공유하는 C FILE *에서 C++ streambuf 개체를 만드는 방법은 무엇입니까?

표준 방법이없는 것처럼 보입니다.

Boost에는 파일 설명자를 사용하는 생성자가있는 stream_buffer 클래스가있어 C 코드로 열린 파일에서 C++ 기능을 사용할 수 있습니다. 예를 들어

boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink> mysb (fileno(myFileptr), boost::iostreams::never_close_handle)); 

myFileptr *이 입력 파일의 존재. 문제는 mysb이고 myFileptr이 가리키는 FILE 개체가 별도의 버퍼를 유지하므로이 옵션이 없음 ...

여기 내 문제의 컨텍스트가 있습니다. C 인터페이스 (모든 내 보낸 변수, 함수 인수 및 함수 반환 값은 C 유형이 있어야 함)를 사용하여 동적으로 링크 가능한 라이브러리를 제공해야하지만 라이브러리는 실제로 C++로 개발됩니다.

내가 내부적으로

Void MyExportedFunct(FILE* myfile) 

가 그리고, 나는 C 프로그램에서 라이브러리를 가져올이 프로토 타입, C++ 스트림 기능을 사용하여 함수를 내보내는 경우 : 나는에 데이터를 싶습니다

int main() 
{ 
    FILE * fptr = fopen(“SomeFile”, "w"); 
    fprintf(fptr, “Some data.”) 
    MyExportedFunct(fptr); 
    fprintf(fptr, “Some more data…”) 
    return 0; 
} 

실제로 올바른 순서로 전송 된 파일에 쓰여질 수 있습니다 (인터리브 문자 제외).

이를 달성하는 방법이나 다른 접근 방법에 대한 제안은 언제나 환영합니다.

+0

스마트 따옴표 이것은 실제 코드가 아닙니다. C 태그를 제거하고 복원하는 것에 대해 사과드립니다. –

+0

@WeatherVane 나는 틀렸다고 확신하지 못합니다. 이것은 C++에 대한 질문입니다. C에서 상속 된 기능을 사용한다는 사실은 관련성이 없어야합니다. –

+0

@ MarkRansom 질문에 C가 언급되었을 때 나는 C 태그를 제거하기 위해 최근에 내려졌습니다. 여기서 OP는 C 프로그램에서 라이브러리를 가져오고 있습니다. –

답변

3

stdio 위에 레이어 인 C + + streambuf가 존재하므로 스트림 버퍼를 계속 플러시하는 것으로 충분합니다.

은 자동 플러시 부분은 이식 std::unitbuf를 사용하여 수행됩니다 :

mysb << std::unitbuf; 

아, 그것은 stdio_filebuf 이름과 GCC의 C되어있어 ++ 라이브러리 :` "SomeFile"`쇼 같은 __gnu_cxx::stdio_filebuf::stdio_filebuf constructor

+0

@ ben-voigt가 지적했듯이 이것은 gcc 확장입니다. 이를 수행 할 수있는 휴대용 방법이 없습니다. –

+2

@MarshallClow : 불행한 점은 표준 라이브러리가'file'의 맨 위에'streambuf' 클래스를 만들어서'cin','cout','cout'에 대한 올바른'sync_with_stdio()'행동을 얻는 것이 절대적으로 필요하기 때문입니다. cerr','clog'.이러한 클래스는 다른 파일/스트림과 함께 사용하기 위해 표준 방식으로 노출되지 않습니다. –

+0

@BenVoigt : C'FILE' 객체와'stdio_filebuf' 객체가 동일한 기본 버퍼를 공유한다면, 계속해서 플러시 할 필요가 없습니다. 권리? – Guett31