2013-05-06 77 views
6

我通過一次讀取文件來查找它包含的行數,然後再次讀取它,這樣我就可以將每行的一些數據存儲在一個數組中。有沒有更好的方法來讀取文件兩次而不是關閉並再次打開?這是我得到的,但恐怕效率不高。如何在同一行中兩次讀取同一個文件

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

即使你使用C++,你可以使用'vector'而不是數組:http://www.cplusplus.com/reference/vector/ – Patashu 2013-05-06 07:00:33

+0

爲什麼不使用'vector <>'來存儲信息當你第一次從文件中讀取它時 - 矢量會自動調整大小,因爲它需要更多的內存。 – 2013-05-06 07:01:32

+0

看看[這裏](http://en.cppreference.com/w/cpp/io/basic_ostream/seekp)。實際上可能[這裏](http://en.cppreference.com/w/cpp/io/basic_istream/seekg)。 – ChiefTwoPencils 2013-05-06 07:04:07

回答

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

只需使用:

settingsFile.seekg(0, settingsFile.beg); 

這將倒帶文件指針開始,這樣你就可以在不關閉並重新打開看了一遍。

+3

當有人看到一個數組 - 「... ... ...」時,很高興看到實際回答問題的答案,而不是當前默認答案。 +1 – ChiefTwoPencils 2013-05-06 07:09:15

+0

這不起作用。 'while(getline(settingsFile,setting))'從來沒有發生過。 – Celeritas 2013-05-06 07:25:14

+2

@Celeritas這是因爲eofbit仍然設置。在循環之前調用file.clear()。 – jrok 2013-05-06 07:43:18

3

效率低下,請使用std::vector並僅讀取一次文件。

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

如果文件太大並且向量不適合內存,則可能不適合使用此方法 – mvp 2013-05-06 07:07:08

+3

@mvp:對於數組也是如此。 – 2013-05-06 07:20:42

3

要快退文件回到它的起點(如讀一遍),你可以使用ifstream::seekg()改變光標和ifstream::clear()的位置,可以將所有內部錯誤標誌(否則會出現你仍然在文件的結尾)。

其次,您可能需要考慮只讀取一次文件,並在解析文件時將臨時需要知道的內容std::dequestd::list存儲。如果您稍後需要特定容器,則可以從臨時容器中構建一個數組(或std::vector)。

相關問題