2011-01-16 11 views
13

Cosa restituisce il metodo istream::getline?istream :: getline tipo restituito

sto chiedendo perché ho visto che per scorrere un file, esso dovrebbe essere fatto in questo modo:

while (file.getline(char*, int)) 
{ 
    // handle input 
} 

Ciò che viene restituita?

+0

istream ed è il tipo di ritorno. – DumbCoder

+0

sì, avrei dovuto dire che lo so già. ma ovviamente c'è qualcosa di strano, perché da esso deriva una qualche forma di vero o falso. –

+0

Sovrastude gli operatori 'bool' o' void * 'in modo che quando viene implicitamente lanciato nella condizione if(), può restituire se EOF è stato raggiunto o meno – Cameron

risposta

15

Restituisce uno stream in modo da poter concatenare l'operazione.

Ma quando si utilizza un oggetto in un contesto booleano, il compilatore cerca un operatore di conversione che può convertirlo in un tipo che può essere utilizzato nel contesto booleano.

In questo caso il flusso ha operator void*(). Dato che questo risulta in un puntatore, può essere utilizzato in un contesto booleano. Quando chiamato controlla i flag di errore. Se vengono impostati failbit o badbit, restituisce NULL che è equivalente a FALSE, altrimenti restituisce un puntatore a self (o qualcos'altro valido anche se non si dovrebbe usare questo fatto)).

in modo da poter usare un getto in qualsiasi contesto che richiederebbe un test booleano:

if (stream >> x) 
{  
} 

while(stream) 
{ 
    /* do Stuff */ 
} 

Nota: E 'pessima idea di testare il flusso verso l'esterno e quindi leggere/scrivere su di esso all'interno del corpo dell'istruzione conditional/loop. Questo perché l'atto di leggere può rendere il flusso cattivo. Di solito è meglio fare la lettura come parte del test.

while(std::getline(steam, line)) 
{ 
    // The read worked and line is valid. 
} 
5

Look da reference. L'istream restituito da getline viene convertito in bool da implicit conversion per verificare il successo dell'operazione. Questa conversione rende l'utilizzo di if(mystream.getline(a,b)) in stenografia per if(!mystream.getline(a,b).fail()).

+0

Il tuo collegamento non contiene nulla che combaci con la tua affermazione. – iheanyi

+0

@iheanyi Aggiunti chiarimenti, forse le pagine sono cambiate nel tempo. –

+0

Grazie, ho rilanciato la tua risposta con quel cambiamento. – iheanyi

2

La funzione restituisce un riferimento all'oggetto corrente stessa, che può essere utilizzato sia per catena leggere ulteriormente operazioni:

myStream.getline(...).getline(...); 

o, perché flussi sono implicitamente convertibile void * s, in un ciclo o condizione:

while (myStream.getline(...)) { 
    ... 
} 

Si può leggere di più su questo sul sito cplusplus.com:

http://cplusplus.com/reference/iostream/istream/getline/

2

Restituisce il flusso stesso. Lo stream può convertire (tramite void*) in bool indicando il suo stato. In questo esempio, il ciclo while termina quando la conversione del flusso su bool diventa "false", che si verifica quando lo stream entra in uno stato di errore. Nel tuo codice, è più probabile che si verifichi quando c'è stato un tentativo di leggere oltre la fine del file. In breve, leggerà quanto c'è e poi si fermerà.

+0

+1. Può convertire in bool perché sovraccarica l'operatore 'bool()' (o 'operator void *()', non è sicuro quale) – Cameron

+0

@Cameron: È 'operator void *()'. –

0

Ognuno ti ha detto quello che è, ora lasciate che vi dica, utilizzare la versione free form

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream 
{ 
// 
} 

Perché questa versione? Dovrebbe diventare immediatamente evidente - si passa in un std::string piuttosto che un buffer di caratteri di dimensione fissa!

+0

ma cosa succede se vuoi un 'char *' invece di un 'std :: string'? questa è la situazione in cui mi trovo. –

+0

'std :: string' ha il metodo' c_str() 'che ti restituisce quello che ti serve, se hai bisogno di modificare la stringa, allora ci sono metodi di' std :: string' puoi usare per modificarlo. – Nim