2013-05-06 10 views
6

Ich lese einmal eine Datei durch, um die Anzahl der Zeilen zu finden, die sie enthält, und lese sie erneut durch, damit ich einige Daten jeder Zeile in einem Array speichern kann. Gibt es eine bessere Möglichkeit, die Datei zweimal durchzulesen, als sie zu schließen und wieder zu öffnen? Hier ist, was ich bekam, aber ich fürchte, es ist ineffizient.Wie man dieselbe Datei zweimal hintereinander liest

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

Wenn Sie C++ verwenden, können Sie anstelle eines Arrays einen 'Vektor' verwenden: http://www.cplusplus.com/reference/vector/ – Patashu

+0

Warum verwenden Sie nicht' vector <> ', um die Informationen zu speichern Wenn Sie das erste Mal aus der Datei lesen, ändert sich der Vektor automatisch, da er mehr Speicher benötigt. –

+0

Werfen Sie einen Blick [hier] (http://en.cppreference.com/w/cpp/io/basic_ostream/seekp). Wahrscheinlich [hier] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg) eigentlich. – ChiefTwoPencils

Antwort

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

Verwenden Sie einfach:

settingsFile.seekg(0, settingsFile.beg); 

Dies wird Dateizeiger auf den Anfang zurückgespult, so dass Sie es wieder ohne Schließen und erneuten Öffnen lesen kann.

+3

Schön, eine Antwort zu sehen, die die Frage statt der allgegenwärtigen Standardantwort beantwortet, wenn jemand ein Array sieht - "... vector ...". +1 – ChiefTwoPencils

+0

Dies funktioniert nicht. 'while (getline (settingsFile, setting))' passiert nie. – Celeritas

+2

@Celeritas das ist, weil eofbit noch eingestellt ist. Rufen Sie file.clear() vor der Schleife auf. – jrok

3

Es ist ineffizient, verwenden Sie eine std::vector und lesen Sie die Datei nur einmal durch.

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

Es ist möglicherweise nicht angebracht, diese Methode zu verwenden, wenn die Datei zu groß ist und Vektor nicht in den Speicher passt – mvp

+3

@mvp: das gilt auch für ein Array. –

3

Um die Datei auf seinen Anfang zurückgespult zurück (zB um es wieder zu lesen) Sie ifstream::seekg() verwenden können, um die Position des Cursors und ifstream::clear() zurücksetzen alle internen Fehler-Flags zu ändern (sonst wird es erscheinen Sie befinden sich noch in das Ende der Datei).

Zweitens möchten Sie möglicherweise prüfen, die Datei nur einmal zu lesen und speichern, was Sie in einem temporären std::deque oder std::list während der Analyse der Datei wissen müssen. Sie können dann ein Array (oder std::vector) aus dem temporären Container erstellen, wenn Sie diesen bestimmten Container später benötigen.

Verwandte Themen