Jump to content

Nome de ficheiro com data atual


Ana Silva
Go to solution Solved by rbsrbs_dev,

Recommended Posts

Oi pessoal!

Será que alguem pode me dizer como posso colocar o ficheiro binario com o nome da data atual e hora?

O meu codigo está assim:

#include <stdio.h>
#include <time.h>

struct dados_cliente{
  char nome[10];
  float valor;
};
typedef struct dados_cliente dados;

int escrever_ficheiro()
{
  time_t ddh;
  time(&ddh);
  char nome = ctime(&ddh);
  dados dados_cliente;
  printf("Insira nome cliente:");
  scanf("%s",dados_cliente.nome);
  printf("valor:");
  scanf("%.2f", dados_cliente.valor);
  FILE* dados;
  dados= fopen(nome+".dat", "ab");
  fprintf(dados, "%s %s %.2f", ctime(&ddh), dados_cliente.nome, dados_cliente.valor);
  fclose(dados);
}

int main()
{
  time_t ddh;
  time(&ddh);
escrever_ficheiro();

	return 0;
}

Agradeço desde já!

Link to comment
Share on other sites

  • Solution

Olá Ana,

O ctime retorna um ponteiro para uma string static, nome precisa de ser char *.
Mas aconselho-te já a evitares usar o ctime neste exemplo:

  • Não tens controlo do formato que é sempre: "Www Mmm dd hh:mm:ss yyyy\n"
  • Os carateres ':' e '\n' são proibidos em filenames em windows (':' em mac), mas mesmo em linux que suporta ambos, é mau gosto usares o '\n'.

Aconselho-te vivamente a usares strftime, por poderes controlar o formato que melhor desejares.
Tens aqui um exemplo de como obter a mesma informação com esta função:

time_t ddh = time(NULL);
struct tm * tm = localtime(&ddh);
char nome[64];
strftime(nome, 64 - 1, "%a %b %e %H.%M.%S %Y", tm);

______________

> scanf("%s",dados_cliente.nome);

Deves ter cuidado com buffer overflows, especialmente com buffers tão pequeninos. Em vez de "%s", podes usar "%9[^ \n]". Mas de preferência usa fgets.

> scanf("%.2f", dados_cliente.valor);

Não podes usar especificador de precisão no scanf. E falta-te o & no argumento.

> dados= fopen(nome+".dat", "ab");

Em C não podes concatenar strings com o operador +. Tens que usar strcat por exemplo. E caso queiras continuar a usar o ctime, não podes concatenar para dentro de `nome` porque a memoria dessa string não te pertence. Terás que fazer strcpy para um buffer teu e só depois strcat(buf, ".dat");
Abrires em modo append também é um pouco inesperado já que é um bocado dificil existir um ficheiro com a data atual, a não ser que estejas a trabalhar com timings críticos 😄

> fprintf(dados, ...

O fprintf está pensado para ser usado para ficheiros de texto, não binários. A não ser que saibas exatamente o que estás a fazer, deves usar fwrite para escrever para ficheiros binários.
 

  • Vote 2
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.