2012-10-22 12 views
6

E 'perfettamente ok (comportamento = ben definito in base allo standard) per chiamare:std :: ifstream :: read o std :: ofstream :: scrittura con un parametro zero?

mystream.read(buffer, 0); 

o

mystream.write(buffer, 0); 

(e, naturalmente, nulla sarà letto o scritto). Vorrei sapere se devo verificare se la dimensione fornita è nullo prima di chiamare una di queste due funzioni.

+0

hai fatto un caso speciale di rendere la dimensione 0..nessun altro – Anirudha

+0

Sono abbastanza sicuro che non accadrà nulla di brutto. – Archimaredes

+0

@Archimaredes, sono incerto. Ricordo vagamente che MSVC ha lanciato un'affermazione quando ho provato questo. Sei sicuro? –

risposta

8

Sì, il comportamento è ben definito: entrambe le funzioni passeranno attraverso i movimenti per le funzioni di input/output non formattate (costruendo la sentinella, impostando failbit se è impostato l'eofbit, svuotando il flusso associato, se necessario), e poi lo faranno arrivare a questa clausola:

§27.7.2.3 [istream.unformatted]/30

personaggi vengono estratti e memorizzati fino a quando una delle seguenti situazioni:

- n caratteri vengono memorizzati;

§27.7.3.7 [ostream.unformatted]/5

caratteri vengono inseriti fino una delle seguenti situazioni

- n sono inseriti caratteri;

"zero caratteri sono memorizzati/inseriti" è vero prima che qualcosa venga memorizzato o estratto.

Guardando implementazioni attuali, vedo for (; gcount < n; ++gcount)in libc++ o sgetn(buffer, n);in stdlibc++ che ha il equivalent loop

0

Un'altra estrazione da 27.7.2.3 Unformatted input functions/1 ci dà un indizio che buffer di ingresso zero dimensioni sono valido caso:

ingresso formattato le funzioni che assumono un array di caratteri di dimensioni non-zero come argomento devono anche memorizzare un carattere null (utilizzando charT()) nella prima posizione dell'array.

Problemi correlati