0

我最近开始使用文件,但在我的主要大学项目中实施它们时遇到了一些麻烦。

以下代码计算您输入数字并按 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)“时代.txt”

  1. 约翰 M 1.449s
  2. 丽兹 F 1.552s
  3. 埃利亚斯 M 1.788s

新时间:Albert M 1.522s

“Times.txt” - 更新

  1. 约翰 M 1.449s
  2. 阿尔伯特 M 1.522s
  3. 丽兹 F 1.552s
  4. 埃利亚斯 M 1.788s

2)“时代.txt”

  1. 约翰 M 1.449s
  2. 阿尔伯特 M 1.522s
  3. 丽兹 F 1.552s
  4. 埃利亚斯 M 1.788s
  5. 抢 M 1.819s
  6. 乔 M 1.842s
  7. 灰 M 1.893s
  8. 珊莎 F 2.108s
  9. 雪 M 2.134s
  10. 安迪 M 2.333s

新时间:Ana F 1.799s

“Times.txt” - 更新

  1. 约翰 M 1.449s
  2. 阿尔伯特 M 1.522s
  3. 丽兹 F 1.552s
  4. 埃利亚斯 M 1.788s
  5. 安娜 F 1.799s
  6. 抢 M 1.819s
  7. 乔 M 1.842s
  8. 灰 M 1.893s
  9. 珊莎 F 2.108s
  10. 雪 M 2.134s

可能的解决方案:我考虑过每次移动到一个数组位置并在数组中将它们排序,然后重写文件。问题是,我不知道如何以这种方式操作代码。任何帮助将不胜感激。

*注意:文件不应在名称前显示职位编号

4

1 回答 1

0

我建议你使用一个结构:

struct Entry
{
  std::string name;
  unsigned int seconds;
};

现在重载operator <以启用排序:

struct Entry
{
    bool  operator<(const Entry& e)
    {
       if (name == e.name)
       {
         return seconds < e.seconds;
       }
       else
       {
         return name < e.name;
       }
    }
    std::string name;
    unsigned int seconds;
};

现在您可以创建向量来保存所有名称:

std::vector<Entry> students;

你可以std::sort在向量上使用。(查找 的语法std::sort)。

如果您很聪明,您将研究如何将矢量写入文件,而不是在这里发布。(提示:在 StackOverflow 上已多次回答)。

于 2013-04-13T16:41:48.040 回答