Чтение и организация файловых строк C++

Недавно я начал использовать файлы, и у меня возникли проблемы с их реализацией в моем основном проекте колледжа.

Следующий код измеряет, сколько времени вам потребуется, чтобы ввести число и нажать 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) "Times.txt"

  1. Джон М 1.449s
  2. Лиз Ф 1.552с
  3. Элиас М 1.788s

Новое время: Альберт М 1.522с

«Times.txt» — обновлено

  1. Джон М 1.449s
  2. Альберт М 1.522s
  3. Лиз Ф 1.552с
  4. Элиас М 1.788s

2) "Times.txt"

  1. Джон М 1.449s
  2. Альберт М 1.522s
  3. Лиз Ф 1.552с
  4. Элиас М 1.788s
  5. Роб М 1.819с
  6. Джо М 1,842 с
  7. Ясень М 1.893с
  8. Санса Ф 2.108с
  9. Снежный М 2.134с
  10. Энди М 2.333 с

Новое время: Ana F 1.799s

"Times.txt" - обновлено

  1. Джон М 1.449s
  2. Альберт М 1.522s
  3. Лиз Ф 1.552с
  4. Элиас М 1.788s
  5. Ана Ф 1.799с
  6. Роб М 1.819с
  7. Джо М 1,842 с
  8. Ясень М 1.893с
  9. Санса Ф 2.108с
  10. Снежный М 2.134с

Возможное решение. Я думал о том, чтобы каждый раз перемещаться в позицию массива и сортировать их внутри массива, а затем переписывать файл. Дело в том, что я понятия не имею, как манипулировать кодом таким образом. Любая помощь будет оценена.

*Примечание: файл не должен отображать номер позиции перед названием


person Guillherme Routar    schedule 13.04.2013    source источник


Ответы (1)


Я предлагаю вам использовать структуру:

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 уже несколько раз отвечали).

person Thomas Matthews    schedule 13.04.2013