Como criar um arquivo inserindo a hora no seu nome

1. Como criar um arquivo inserindo a hora no seu nome

Tiago da Silva Pimentel
Tiago Pimentel

(usa Ubuntu)

Enviado em 25/07/2015 - 18:33h

Boa noite pessoal, estou precisando de uma ajudinha aqui.
Tenho um trabalho da faculdade, sendo desenvolvido em c++, onde eu queria pegar os dados gerados e inseri-los num arquivo qualquer, acontece que como estou sempre executando, eu precisaria gerar vários arquivos com nomes diferentes, podendo usar a hora da execução como diferença, por exemplo:
usando
1º execução: saida(12:45:35).txt - ou seja, ele foi executado às 12 horas 45 minutos e 35 segundos
2º execução: saida(12:52:47).txt
3º execução: saida(13:05:17).txt
e por vai.

Estou usando o ofstream para gerar o arquivo, e o __TIME__, pra pegar a hora.
Mas não consigo gera o arquivo do jeito que eu quero.
Segue o código que estou tentando:

stringstream dados;
dados << "dados";

// criar arquivo de saida
stringstream fileOUTname;
fileOUTname << "saida("
<< __TIME__
<< ").c";

ofstream myfile;
myfile.open (fileOUTname.str);
myfile << dados.str();
myfile.close();


O problema é que a função .opem(), não esta aceitando o parâmetro, segue o erro:

sintatica.y: Na função ‘int yyparse()’:
sintatica.y:141:35: erro: no matching function for call to ‘std::basic_ofstream<char>::open(std::basic_stringstream<char>::__string_type)’
sintatica.y:141:35: nota: candidato é:
/usr/include/c++/4.6/fstream:702:7: nota: void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [com _CharT = char, _Traits = std::char_traits<char>, std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c++/4.6/fstream:702:7: nota: nenhuma conversão para o argumento 1 de ‘std::basic_stringstream<char>::__string_type {aka std::basic_string<char>}’ para ‘const char*’


Espero que possam me ajudar..





  


2. Re: Como criar um arquivo inserindo a hora no seu nome

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 25/07/2015 - 19:06h

Tiago Pimentel escreveu:

Boa noite pessoal, estou precisando de uma ajudinha aqui.
Tenho um trabalho da faculdade, sendo desenvolvido em c++, onde eu queria pegar os dados gerados e inseri-los num arquivo qualquer, acontece que como estou sempre executando, eu precisaria gerar vários arquivos com nomes diferentes, podendo usar a hora da execução como diferença, por exemplo:
usando
1º execução: saida(12:45:35).txt - ou seja, ele foi executado às 12 horas 45 minutos e 35 segundos
2º execução: saida(12:52:47).txt
3º execução: saida(13:05:17).txt
e por vai.

Estou usando o ofstream para gerar o arquivo, e o __TIME__, pra pegar a hora.
Mas não consigo gera o arquivo do jeito que eu quero.
Segue o código que estou tentando:

stringstream dados;
dados << "dados";

// criar arquivo de saida
stringstream fileOUTname;
fileOUTname << "saida("
<< __TIME__
<< ").c";

ofstream myfile;
myfile.open (fileOUTname.str);
myfile << dados.str();
myfile.close();


O problema é que a função .opem(), não esta aceitando o parâmetro, segue o erro:

sintatica.y: Na função ‘int yyparse()’:
sintatica.y:141:35: erro: no matching function for call to ‘std::basic_ofstream<char>::open(std::basic_stringstream<char>::__string_type)’
sintatica.y:141:35: nota: candidato é:
/usr/include/c++/4.6/fstream:702:7: nota: void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [com _CharT = char, _Traits = std::char_traits<char>, std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c++/4.6/fstream:702:7: nota: nenhuma conversão para o argumento 1 de ‘std::basic_stringstream<char>::__string_type {aka std::basic_string<char>}’ para ‘const char*’


Espero que possam me ajudar..



Amigo, você precisa abrir o arquivo com modo de "input", adicionando o ios::out ao abrir o arquivo.

Por exemplo:

myfile.open (fileOUTname.str,ios::out);


Dê uma olhada aqui: http://www.cplusplus.com/doc/tutorial/files/

Espero ter ajudado

[]'s

T+

--
http://piadasnerds.com/wp-content/uploads/2011/08/grafico_souProgramador.png


3. Re: Como criar um arquivo inserindo a hora no seu nome

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/07/2015 - 21:45h

A macro __TIME__ não serve para fazer o que você quer. Quando você a usa, o compilador (na verdade, o preprocessador, que é invocado pelo compilador como uma das etapas da compilação) substitui o valor da hora no momento da compilação (ou, mais precisamente, do preprocessamento), e esse valor fica fixo no programa. Se você rodar, depois, o programa compilado dez vezes, nas dez vezes a hora gerada será a mesma: o valor fixo do momento em que você pediu para compilar o programa.

Se você quer usar o valor de hora de quando o programa é executado, você deve trabalhar com as funções de <ctime> (time(), localtime(), strftime(), entre outras).


4. Re: Como criar um arquivo inserindo a hora no seu nome

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 26/07/2015 - 10:35h


Embora chrono já faça parte do C++11, eu ainda prefiro usar ctime nesses casos.

Só complementar o que Paulo falou,

Existem N maneiras de fazer isso, uma das seria;


#include <sstream>
#include <ctime>
#include <fstream>
#include <iostream>


using namespace std;

int main() {

//Guarda o timestamp atual
time_t now = time(0);
//Converte para uma estrutura a qual irá facilitar para separar os dados
struct tm *local = localtime( &now );

//String Stream é mais recomedado, não precisar converter cada tipo
stringstream ss;
ss << local->tm_hour << ":" << local->tm_min << ":" << local->tm_sec << ".txt";

//C++11 suporta construtor com string
ofstream of(ss.str());
//Caso não for possível construi o arquivo, será lançado uma exceção
cout << "Criado " << ss.str() << " com sucesso." << endl;

return 0;
}


Utiilizando a chrono da C++11 só acarretaria uma linha a mais, uma vez que ela não possua facilidade para converter para tempo já formatado.


5. Re: Como criar um arquivo inserindo a hora no seu nome

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/07/2015 - 11:49h

Há pouco tempo eu precisei fazer (bom, "precisar" talvez seja exagero, pois poderia ter feito de outra forma -- e talvez tivesse perdido menos tempo) umas classes para formatação de data e hora, contemplando fuso-horário (mal suportado no SO com o qual eu estava trabalhando) e frações de segundo (não suportado pelas funções padronizadas). Eu acabei não usando nada da std::chrono porque sinceramente não consegui ver vantagem em usá-la. Acabei trabalhando somente com std::time_t, std::tm e com o tipo timespec do POSIX.

Com relação à formatação mostrada acima, eu acho que seria interessante ligar a largura mínima de 2 e o preenchimento de zeros à esquerda na hora de colocar os inteiros no stream. Caso contrário, ele pode ficar com um arquivo com nome “11:5:8.txt”. Além de feio, pode confundir a ordenação. Também, os caracteres de dois pontos (“:”) podem dar problema com sistemas da Microsoft.

Acho que tudo ficaria mais curto se se usasse strftime().

#include <ctime>  // Para time(), localtime(), strftime() e o tipo time_t.
#include <limits.h> // Para a constante PATH_MAX (não sei se existe similar no WIndows).

int main(void){
char filename[PATH_MAX];
time_t now=time(nullptr);
if(!strftime(filename, sizeof filename, "prefixo-%Y%m%dT%H.%M%S%Z.sufixo", localtime(&now))){
// Nome excedeu tamanho máximo (seu prefixo e sufixo devem ser bem grandes, hein!).
}
/* ... */
}



6. Obrigado pessoal[CONSEGUI]

Tiago da Silva Pimentel
Tiago Pimentel

(usa Ubuntu)

Enviado em 26/07/2015 - 12:21h

Pessoal, obrigado por reponderem, acabou que consegui aqui.
Meu problema não era nem tanto com o __TIME__, só usei ele pois atendia a minha necessidade de gerar arquivos com nomes diferentes.
Meu problema mesmo era criar o arquivo com esse nome "aleatorio", pois o myflie.open, não tava aceitando a string.
Acabou que eu consegui fazendo assim:


stringstream fileOUTname; //crio o stringstream para armazenar o nome
fileOUTname << "saidas/saida(" << __TIME__ << ").c"; //insiro o nome com a saida(hora_atual_.c

ofstream myfile; //
myfile.open (fileOUTname.str().c_str()); //Uso o método .str para retornar uma string, e ja uso o .c_str(), pra retornar com const char array


Bom pessoal, obrigado por responderem minha pergunta.
Mas uma vez, vi que posso contar com o pessoal daqui!



7. Re: Como criar um arquivo inserindo a hora no seu nome

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 26/07/2015 - 13:14h


Bem lembrado, Paulo.
Não enfatizei a formatação. Obrigado por lembrar.

Bom estudo, Tiago.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts