2012-03-01 3 views
7

ho cercato di fare in questo modoCome leggere una specifica quantità di caratteri da un file di testo

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char b[2]; 
    ifstream f("prad.txt"); 
    f>>b ; 
    cout <<b; 
    return 0; 
} 

Dovrebbe essere 2 caratteri ma si legge tutta la linea. Questo ha funzionato su un'altra lingua ma non funziona in C++ per qualche ragione.

+0

+1 e "Grazie" per fornire un programma di esempio breve e completo. http://sscce.org –

+4

"Questo ha funzionato su un'altra lingua ma non funziona in C++ per qualche motivo." Questa è una delle peggiori supposizioni che puoi fare nella programmazione. Sono due lingue diverse, quindi possono avere un comportamento diverso. – PlasmaHH

+0

Sì, è piuttosto pericoloso andare in giro a pensarlo. Se stai venendo in C++ da Java (che è quello che sembra dal tuo errore) hai davvero bisogno di sederti con qualche lettura su puntatori e array e assicurarti di ottenere ciò che sta succedendo prima di spararti ai piedi. – zmccord

risposta

8

È possibile utilizzare read() per specificare il numero di caratteri da leggere:

char b[3] = ""; 
ifstream f("prad.txt"); 

f.read(b, sizeof(b) - 1); // Read one less that sizeof(b) to ensure null 
cout << b;    // terminated for use with cout. 
+1

Al fine di rendere la relazione tra '3' e' 2' un po 'più evidente, consiglierei di usare una costante nominata. 'size_t const BufferSize = 2;', 'char b [BufferSize + 1] =" ";' e 'f.read (b, BufferSize);' –

+0

@MatthieuM., Normalmente userei 'sizeof (b) - 1 '(se possibile). Codice aggiornato – hmjd

+0

Sono sempre riluttante a raccomandare questo, perché se 'b' è un puntatore la compilazione funziona ancora si ottiene un' 7' fisso su piattaforme a 64 bit. Però potresti usare una funzione 'size' per gli array, con i template è facile. –

0
istream& get (char* s, streamsize n); 

Estratti caratteri dal flusso e li memorizza come c-stringa in matrice inizio alle s. I caratteri vengono estratti fino a quando non sono stati estratti i caratteri (n - 1) o il carattere di delimitazione '\ n' è trovato. L'estrazione si arresta anche se viene raggiunta la fine del file nella sequenza di input o se si verifica un errore durante l'operazione di input. Se viene trovato il carattere di delimitazione, non viene estratto dalla sequenza di input e rimane come il prossimo carattere da estrarre. Usa la linea diretta se vuoi che questo personaggio sia estratto (e scartato). Il carattere null finale che segnala la fine di una stringa c è automaticamente aggiunto alla fine del contenuto memorizzato in s.

2

Questo lavorato su un'altra lingua, ma non funziona in C++ per qualche motivo .

Alcune cose cambiano da lingua a lingua. In particolare, in questo caso si è a conoscenza del fatto che in C++ puntatori e array sono scarsamente diversi. Quell'array viene passato all'operatore >> come un puntatore a char, che viene interpretato come un puntatore a stringa, quindi fa ciò che fa sui char buffer (per leggere fino al limite di larghezza o alla fine della riga, a seconda di cosa viene prima). Il tuo programma dovrebbe causare il crash di quando ciò accade, dal momento che stai sovraccaricando il tuo buffer.