2013-05-06 13 views
6

Przeczytałem jeden raz plik, aby znaleźć liczbę zawartych w nim wierszy, a następnie przeczytałem je ponownie, dzięki czemu mogę przechowywać niektóre dane z każdej linii w tablicy. Czy istnieje lepszy sposób na odczytanie pliku dwukrotnie niż zamknięcie i ponowne otwarcie? Oto, co mam, ale obawiam się, że jest to nieefektywne.Jak odczytać ten sam plik dwa razy z rzędu

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

Ponieważ używasz C++, możesz użyć 'wektora' zamiast tablicy: http://www.cplusplus.com/reference/vector/ – Patashu

+0

Dlaczego nie używać' wektora <> do przechowywania informacji gdy czytasz go z pliku za pierwszym razem - wektor automatycznie zmieni rozmiar, ponieważ potrzebuje więcej pamięci. –

+0

Zobacz [tutaj] (http://pl.cppreference.com/w/cpp/io/basic_ostream/seekp). Prawdopodobnie w rzeczywistości [tutaj] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg). – ChiefTwoPencils

Odpowiedz

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

Wystarczy użyć:

settingsFile.seekg(0, settingsFile.beg); 

To będzie przewinąć wskaźnik pliku na samym początku, więc można ją przeczytać ponownie bez zamykania i ponownego otwierania.

+3

Miło widzieć odpowiedź, która faktycznie odpowiada na pytanie zamiast zawsze aktualnej odpowiedzi domyślnej, gdy ktoś widzi tablicę - "... wektor ...". +1 – ChiefTwoPencils

+0

To nie działa. 'while (getline (settingsFile, setting))' never happen. – Celeritas

+2

@Celeritas to dlatego, że eofbit jest nadal ustawiony. Wywołaj plik file.clear() przed pętlą. – jrok

3

Jest to nieefektywne, należy użyć std::vector i odczytywać plik tylko raz.

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

Stosowanie tej metody może nie być właściwe, jeśli plik jest zbyt duży, a wektor nie pasuje do pamięci – mvp

+3

@mvp: to prawda również w przypadku tablicy. –

3

Aby przewinąć plik do jego początku (na przykład, aby ją przeczytać ponownie) można użyć ifstream::seekg() aby zmienić położenie kursora i ifstream::clear() zresetować wszystkie wewnętrzne flagi błędów (w przeciwnym razie pojawi się ona nadal jesteś w koniec pliku).

Po drugie, możesz rozważyć przeczytanie pliku tylko raz i przechowywanie informacji, które musisz wiedzieć, podczas tymczasowego analizowania pliku. Następnie możesz zbudować tablicę (lub std::vector) z tymczasowego kontenera, jeśli później będziesz potrzebował tego konkretnego kontenera.

Powiązane problemy