Domanda

Per scopi educativi Voglio creare un buffer di ostream e flusso di fare:

  1. endians fix quando si fa << myVar;
  2. conservare in un contenitore deque invece di usare std: cout o la scrittura su un file
  3. registrare i dati aggiuntivi, come ad esempio quante volte ho <<, quante volte ho fatto .write, la quantità di byte ho scritto e quante volte ho flush (). Ma non ho bisogno di tutte le informazioni.

Ho cercato di sovraccaricare ma fallito orribilmente. Ho provato sovraccarico scrittura facendo

ostream& write( const char* s, streamsize n ) 

nella mia classe basic_stringstream2 (ho copiato pasta basic_stringstream nel mio file cpp e modificato), ma il codice tenuta mediante basic_ostream. Ho guardato attraverso il codice e sembra che ho bisogno di sovraccaricare xsputn (che non è menzionato in questa pagina http : //www.cplusplus.com/reference/iostream/ostream ) ma che altro ho bisogno di sovraccaricare? e come costruisco la mia classe (che cosa ha bisogno di ereditare, ecc)?

È stato utile?

Soluzione

L'approccio canonica consiste nel definire il proprio streambuf. Si dovrebbe avere uno sguardo a:

Altri suggerimenti

Per A + C) Penso che si dovrebbe guardare sfaccettature, modificano come gli oggetti sono scritti come caratteri. È possibile memorizzare le statistiche qui pure su quante volte tu abbia trasmesso i vostri oggetti. Visualizza il Come formattare i miei oggetti quando si utilizza STL flussi? per un esempio.

Per B) È necessario creare il proprio streambuf e connettere l'ostream a tale buffer (argomento del costruttore). Vedi di Luc link + Derivazione nuove classi streambuf . In breve è necessario implementare questo per un ostream (minimo):

  • troppopieno (mettere un singolo carattere o tampone flush) ( link )
  • xsputn (inserisce una matrice char di buffer) ( link )
  • sync ( link )

Non sono sicuro che ciò che si vuole fare è possibile. Gli operatori << non sono virtuali. Così si potrebbe definire yourstream &operator << (yourstream &strm, int i) a fare quello che vuoi con la conversione endian e il conteggio, e funzionerà quando il codice chiama direttamente. Ma se si passa un oggetto yourstream in una funzione che prevede un ostream, ogni volta che chiamate di funzione <<, andrà alla versione originale ostream posto del tuo.

A quanto mi risulta, le strutture ruscelli sono stati istituiti in modo che si può "facilmente" definire un nuovo tipo di flusso che utilizza un diverso tipo di tampone (come, ad esempio, un deque di caratteri), e si può molto facilmente aggiungere il supporto per l'output le proprie classi via <<. Non credo che si hanno lo scopo di essere in grado di ridefinire lo strato intermedio tra quelli.

E in particolare, l'intero punto dell'interfaccia << è quello di fornire output di testo ben formattata, mentre suona come si vuole realmente uscita binaria. (In caso contrario, il riferimento a "endian" non ha senso.) Anche supponendo v'è un certo modo di fare questo non lo so, esso produrrà uscita binaria imbarazzante al meglio. Ad esempio, si consideri il sovraccarico all'utente finale di uscita di un punto nello spazio 3D. La versione utente finale di << probabilmente fare qualcosa di simile << '(' << x << ", " << y << ", " << z << ')'. Che aspetto gradevole in un flusso di testo, ma è un sacco di personaggi sprecati e completamente inutile in un flusso binario, che idealmente basta usare << x << y << z. (E quante chiamate a << dovrebbe quelli contano come?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top