2013-05-06 17 views
6

Una volta ho letto un file per trovare il numero di righe che contiene, quindi lo riletto in modo da poter memorizzare alcuni dati di ogni riga in un array. C'è un modo migliore per leggere il file due volte rispetto alla chiusura e riaprirlo? Ecco cosa ho ottenuto, ma temo che sia inefficiente.Come leggere lo stesso file due volte di seguito

int numOfMappings = 0; 
ifstream settingsFile("settings.txt"); 
string setting; 
while(getline(settingsFile, setting)) 
{ 
    numOfMappings++; 
} 
char* mapping = new char[numOfMappings]; 
settingsFile.close(); 
cout << "numOfMappings: " << numOfMappings << endl; 
settingsFile.open("settings.txt"); 
while(getline(settingsFile, setting)) 
{ 
    cout << "line: " << setting << endl; 
} 
+2

STATO che stai usando C++, puoi usare un 'vector' invece di un array: http://www.cplusplus.com/reference/vector/ – Patashu

+0

Perché non usare un' vector <> 'per memorizzare le informazioni mentre lo leggi dal file la prima volta: il vettore verrà ridimensionato automaticamente in quanto ha bisogno di più memoria. –

+0

Dai un'occhiata [qui] (http://en.cppreference.com/w/cpp/io/basic_ostream/seekp). Probabilmente [qui] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) in realtà. – ChiefTwoPencils

risposta

16
settingsFile.clear(); 
settingsFile.seekg(0, settingsFile.beg); 
0

Basta usare:

settingsFile.seekg(0, settingsFile.beg); 

Questa riavvolge puntatore del file fin dall'inizio, in modo da poter leggere di nuovo senza chiudere e riaprire.

+3

È bello vedere una risposta che risponda effettivamente alla domanda anziché la risposta predefinita sempre presente quando qualcuno vede un array - "... vettore ...". +1 – ChiefTwoPencils

+0

Questo non funziona. 'while (getline (settingsFile, setting))' non succede mai. – Celeritas

+2

@Celeritas perché Eofbit è ancora impostato. Chiama file.clear() prima del ciclo. – jrok

3

È inefficiente, utilizzare std::vector e leggere il file una sola volta.

vector<string> settings; 
ifstream settingsFile("settings.txt"); 
string setting; 
while (getline(settingsFile, setting)) 
{ 
    settings.push_back(setting); 
} 
+1

Potrebbe non essere appropriato utilizzare questo metodo se il file è troppo grande e il vettore non si adatta alla memoria – mvp

+3

@mvp: questo vale anche per un array. –

3

Per riavvolgere il file di nuovo al suo inizio (ad esempio, di leggerlo di nuovo) è possibile utilizzare ifstream::seekg() per cambiare la posizione del cursore e ifstream::clear() per azzerare tutte le bandiere di errore interni (altrimenti apparirà siete ancora in la fine del file).

In secondo luogo, si consiglia di prendere in considerazione la lettura del file una sola volta e di memorizzare ciò che è necessario sapere in una temporanea std::deque o std::list mentre si analizza il file. È quindi possibile costruire un array (o std::vector) dal contenitore temporaneo, se in seguito sarà necessario quel contenitore specifico.

Problemi correlati