2013-05-06 109 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)。

相关问题