15

ファイルに含まれる行数を見つけるためにファイルを一度読んでから、もう一度読んで、各行のデータを配列に格納できるようにします。ファイルを閉じて再度開くよりも、ファイルを 2 回読み通す方がよい方法はありますか? これが私が得たものですが、効率が悪いのではないかと心配しています。

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;
}
4

4 に答える 4

28
settingsFile.clear();
settingsFile.seekg(0, settingsFile.beg);
于 2013-05-06T07:01:40.333 に答える
5

ファイルを最初に巻き戻す (たとえば、もう一度読む) には、 を使用ifstream::seekg()してカーソルの位置を変更し、ifstream::clear()すべての内部エラー フラグをリセットします (そうしないと、まだファイルの最後にいるように見えます)。

次に、ファイルを 1 回だけ読み取り、必要な情報を一時的に、std::dequeまたはstd::listファイルの解析中に保存することを検討してください。std::vector後で特定のコンテナーが必要になった場合は、一時コンテナーから配列 (または ) を作成でき ます。

于 2013-05-06T07:38:24.923 に答える
4

これは非効率的です。 astd::vectorを使用して、ファイルを 1 回だけ読み取ります。

vector<string> settings;
ifstream settingsFile("settings.txt");
string setting;
while (getline(settingsFile, setting))
{
    settings.push_back(setting);
}
于 2013-05-06T07:02:18.303 に答える
1

使用するだけです:

settingsFile.seekg(0, settingsFile.beg);

これにより、ファイルポインターが最初に巻き戻されるため、閉じて再度開くことなく再度読み取ることができます。

于 2013-05-06T07:01:52.563 に答える