массивы — Чтение и организация строк файла Переполнение стека

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

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

#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.449 с
  2. Лиз Ф 1.552с
  3. Элиас М 1.788s

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

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

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

2)
«Times.txt»

  1. Джон М 1.449 с
  2. Альберт М 1.522с
  3. Лиз Ф 1.552с
  4. Элиас М 1.788s
  5. Rob M 1.819s
  6. Джо М 1.842с
  7. Ash M 1.893s
  8. Sansa F 2.108s
  9. Снег М 2.134с
  10. Энди М 2.333с

Новое время: Ана Ф 1.799

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

  1. Джон М 1.449 с
  2. Альберт М 1.522с
  3. Лиз Ф 1.552с
  4. Элиас М 1.788s
  5. Ана Ф 1.799 с
  6. Rob M 1.819s
  7. Джо М 1.842с
  8. Ash M 1.893s
  9. Sansa F 2.108s
  10. Снег М 2.134с

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]