2009-07-24 12 views
5

E 'possibile in C/C++ creare il proprio flusso personalizzato di tipo FILE (stdio.h) che può essere utilizzato con fputs() ad esempio?tipo FILE personalizzato in C/C++

+1

Quale lingua stai utilizzando, C o C++? –

+0

Sto usando l'API C++ che richiede un FILE * come argomento. –

+0

http://stackoverflow.com/questions/539537/memory-buffer-as-file/539608#539608 - ti aiuta? –

risposta

5

Se il tuo "flusso personalizzato" non è qualcosa che puoi rappresentare con un descrittore di file o un handle di file, allora sei sfortunato. Il tipo FILE è definito dall'implementazione, quindi non esiste un modo standard per associare altri elementi a uno.

Se è possibile ottenere un descrittore di file C per qualsiasi cosa si stia cercando di scrivere, è possibile chiamare fdopen su di esso per trasformarlo in un FILE*. Non è standard C o C++, ma è fornito da Posix. Su Windows, è scritto _fdopen.

Se si utilizza Windows e si dispone di un HANDLE, è possibile utilizzare _open_osfhandle per associare un descrittore di file con esso e quindi utilizzare _fdopen da lì.

Sei davvero legato allo fputs? In caso contrario, sostituirlo con l'uso di un IOStream C++. Quindi è possibile fornire il proprio discendente di std::basic_streambuf, inserirlo in un std::ostream e utilizzare I/O standard di C++ su di esso.

+0

Grazie mille, questo funziona: CreatePipe() + _open_osfhandle() + fdopen() –

6

No, non lo è. FILE è ciò che è noto come un tipo opaco: non ha nulla che tu possa personalizzare.

+0

Allora come mai Windows può gestire file su disco, file sulla rete, file virtuali, ...? Alcuni aspetti devono essere personalizzabili. – xtofl

+1

Nome uno quindi. Il tipo FILE non ha membri disponibili per il programmatore dell'applicazione. –

+0

@xtofl: perché FILE * su Windows esegue il mapping a HANDLE restituito da CreateFile. FILE * non esegue la "personalizzazione" – MSalters

0

È possibile. Ma dovresti collegare la tua applicazione con la tua versione di fputs(), ecc. Invece di quelle che arrivano con le librerie standard. La maggior parte dei compilatori si collega alle librerie IO standard per impostazione predefinita. Devi capire come aggirare questo.

+2

Non vuole riscrivere fputs(), vuole specializzarsi in FILE. O almeno questa è la mia lettura. –

+0

se definisco i miei fput(), qualsiasi chiamata di fputs() passerà attraverso le mie fput. –

1

Non esiste un modo standard con l'interfaccia FILE. Nota che il codice C++ di solito dovrebbe usare IOStream per IO, con l'interfaccia IOStream, scrivere uno streambuf personalizzato è la soluzione al tuo problema.

Se è possibile eliminare la conformità standard, consultare la documentazione della propria implementazione.

  • POSIX ha una funzione popen() che creano una lettura FILE * dall'uscita o scrivendo all'ingresso di un processo;

  • POSIX ha un fdopen() che è in grado di creare un FILE * da un descrittore di file;

  • Almeno per la libu GNU utilizzata da Linux, esiste la possibilità di definire un flusso C personalizzato (vedere la sezione "Programmazione dei flussi personalizzati di awn" nella documentazione informativa).

+0

In che modo popen (0 risolve il problema? –

+0

Non ne sappiamo abbastanza sul problema per essere sicuri. Sappiamo solo che deve passare un FILE * a un'API. Organizzare il suo programma in due o più processi potrebbe essere un soluzione (generazione di un processo che fa un popen() e quindi chiama l'API con il risultato per esempio) – AProgrammer

+0

Vedo, grazie per il suggerimento, ma non posso farlo.L'API che uso ha anche un contesto come argomento e potrebbe essere molto difficile applicare questa soluzione –

3

Se si compila con la libreria GNU C si potrebbe usare fmemopen (3):

fmemopen, aperto _ memstream, aperto _ wmemstream - memoria aperta come flusso

Problemi correlati