私は最近ファイルを使い始めましたが、私の主要な大学のプロジェクトでそれらを実装するのにいくつか問題があります。
次のコードは、数字を入力して Enter キーを押すまでの時間を計測し、ユーザーの名前、性別、時間をファイルに書き込みます。
#include <iostream>
#include <ctime>
#include <fstream>
#include <string>
using namespace std;
int LinesCounter(string filename)
{
ifstream b_file(filename);
// new lines will be skipped unless we stop it from happening:
b_file.unsetf(ios_base::skipws);
// count the newlines with an algorithm specialized for counting:
unsigned line_count = count(
istream_iterator<char>(b_file),
istream_iterator<char>(),
'\n');
return line_count;
}
int main()
{
//Starts timing
clock_t begin = clock();
int letter;
cin>>letter;
cin.ignore();
//Obtains the total amount of seconds taken
clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
cout << "\nCongratulations, you took " <<elapsed_secs <<" seconds." <<endl <<endl;
cout<<"Insert your name: ";
string name;
getline(cin, name);
cout<<endl;
cout<<"M/F: ";
char sex;
cin >> sex;
cout<<endl;
cin.ignore();
int NumberOfLines = LinesCounter("Times.txt");
if (NumberOfLines < 10)
{
ofstream a_file ( "Times.txt", ios::app );
a_file<<name <<" " <<sex <<" " <<elapsed_secs <<"s" <<endl;
a_file.close();
}
cin.get();
}
コードは 10 回 (名前、性別、時間の 10 行) だけを保存することになっており、時間に応じてリストを整理する必要があります。そうすれば、ファイルの 1 行目に最速の時間 (およびそれぞれのユーザーの名前と性別) が表示され、最後に最も遅い時間が表示されます。例:
1) 「Times.txt」
- ジョン M 1.449s
- リズ F 1.552秒
- エリアス M 1.788s
新しい時間: アルバート M 1.522s
"Times.txt" - 更新
- ジョン M 1.449s
- アルバート M 1.522s
- リズ F 1.552秒
- エリアス M 1.788s
2) 「Times.txt」
- ジョン M 1.449s
- アルバート M 1.522s
- リズ F 1.552秒
- エリアス M 1.788s
- ロブ M 1.819s
- ジョー M 1.842s
- アッシュ M 1.893s
- サンサ F 2.108s
- スノーM 2.134秒
- アンディ M 2.333秒
新タイム:アナF 1.799秒
"Times.txt" - 更新
- ジョン M 1.449s
- アルバート M 1.522s
- リズ F 1.552秒
- エリアス M 1.788s
- アナ F 1.799s
- ロブ M 1.819s
- ジョー M 1.842s
- アッシュ M 1.893s
- サンサ F 2.108s
- スノーM 2.134秒
考えられる解決策: 毎回配列の位置に移動し、それらを配列内で並べ替えてから、ファイルを書き直すことを考えました。問題は、そのようにコードを操作する方法がわかりません。どんな助けでも大歓迎です。
*注意: ファイルは、名前の前に位置番号を表示することは想定されていません