2014-11-24 15 views
5

È come se leggendo non fosse nemmeno leggibile. Restituisce 0 e non legge alcun carattere. Cosa c'è di sbagliato qui?C++ std :: istream readsome non legge nulla

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::fstream stream("list.cpp", std::ios::in); 

    if (stream.good() || !stream.bad() || stream.is_open()) { 

    std::cout << "Well, stream looks good." << std::endl; 

    char justOneChar = 'L'; 
    auto ssize = stream.readsome(&justOneChar, 1); 

    std::cout << ssize << " : " << justOneChar << std::endl; 
    } 

    return -1; 
} 

uscita:

Beh, flusso sembra buono. 0: L

risposta

4
auto ssize = stream.readsome(&justOneChar, 1); 

1 è il numero massimo di caratteri da leggere. Se i buffer interni dei flussi sono vuoti quando lo chiami, riceverai il valore zero come valore di ritorno.

La citazione seguente (con il mio grassetto) mostra questo aspetto:

streamsize readsome (char* s, streamsize n);

estratti fino a n caratteri dal flusso e li memorizza nella matrice puntato dal s, fermandosi più presto il buffer interno mantenuto dall'oggetto buffer di flusso associato (se presente) esaurisce i caratteri, anche se la fine del file non è stata ancora raggiunta.

La funzione è destinato ad essere utilizzato per leggere i dati da determinati tipi di sorgenti asincrone che possono eventualmente attendere più caratteri, poiché ferma estrazione caratteri appena il buffer interno è esaurito, evitando possibili ritardi.

È fondamentalmente un modo per ottenere quanti caratteri sono disponibili (soggetto al limite specificato) senza dover attendere che lo streaming fornisca di più.

7

Consulenza a reference,

Il comportamento di questa funzione è altamente specifico dell'implementazione. Ad esempio, se utilizzato con std::ifstream, alcune implementazioni di libreria riempiono il sottostante filebuf con i dati non appena il file viene aperto (e readsome() su tali implementazioni legge i dati, potenzialmente, ma non necessariamente, l'intero file), mentre altre implementazioni leggono solo da file quando viene richiesta un'operazione di immissione effettiva (e emessa dopo l'apertura del file non estrae mai alcun carattere). Allo stesso modo, una chiamata a std::cin.readsome() può restituire tutti gli input in sospeso della console non elaborati, oppure può sempre restituire zero e non estrarre alcun carattere.

In breve, readsome è abbastanza inutile, almeno per i flussi standard. È una lettura super-non bloccante: caricherà solo i dati che sono stati memorizzati nel buffer nel processo a livello utente e non effettuerà mai una chiamata al kernel.

1

Non funziona perché potrebbero non esserci caratteri disponibili per la lettura in quell'istante. Funziona come una funzione di lettura non bloccante come qualcuno ha menzionato, quindi questo significa che non aspetta l'input, motivo per cui non ti chiedeva l'input. Quindi, per poterlo usare con successo per leggere qualcosa, ci deve essere qualcosa disponibile nel buffer sottostante.

Per visualizzare il numero di caratteri che è possibile estrarre nella prossima chiamata per essere leggibili, utilizzare la funzione in_avail.

+2

'in_avail' evita di restituire zero, in modo che non possa dirti in modo affidabile che nessun carattere verrà restituito da' readsome'. – Potatoswatter