
phoemur
(usa Debian)
Enviado em 01/09/2017 - 19:08h
Você inclui iostream e fstream dizendo que vai utilizar iostreams do C++ e vai utilizando fopen fput fgets etc que é mais consistente com C puro.
Não que não dê certo, mas a consistência e coerência é muito importante para quem está lendo o código.
Dito isso, existem zilhões de maneiras de fazer isso, usando regex, strings, classes de datas, boost_date_time, etc... cada uma com suas vantagens e desvantagens. Aqui eu fiz assim:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
// struct representando uma data
struct Data {
int dia;
int mes;
int ano;
char separator = '/';
};
// para ler do arquivo
ifstream& operator>>(ifstream& is, Data& dt)
{
char ch1, ch2;
is >> dt.dia >> ch1 >> dt.mes >> ch2 >> dt.ano;
if (ch1 != dt.separator || ch2 != dt.separator)
is.clear(ios::failbit);
return is;
}
// para ordenar os resultados
struct sort_struct {
bool operator()(const Data& ldata, const Data& rdata) {
if (ldata.ano == rdata.ano) {
if (ldata.mes == rdata.mes) {
return ldata.dia < rdata.dia;
}else return ldata.mes < rdata.mes;
}else return ldata.ano < rdata.ano;
}
};
int main()
{
vector<Data> my_vector (0);
ifstream myfile {"entrada.txt", ios::in};
if (!myfile.is_open())
throw runtime_error("Falha ao abrir arquivo de entrada");
ofstream myoutput {"saida.txt", ios::out | ios::trunc };
if (!myoutput.is_open())
throw runtime_error("Falha ao abrir arquivo de saida");
for (Data dt; myfile >> dt;)
my_vector.push_back(dt);
sort(my_vector.begin(), my_vector.end(), sort_struct());
for (Data& d: my_vector) {
myoutput << d.dia << d.separator << d.mes << d.separator << d.ano << endl;
}
return 0;
}
entrada.txt
14/09/1979
25/12/2014
28/12/2012
03/09/2011
11/01/2007
saida.txt
14/9/1979
11/1/2007
3/9/2011
28/12/2012
25/12/2014