iBacchus
iBacchus

Reputation: 175

how to create files named with current time?

I want to create a series of files under "log" directory which every file named based on execution time. And in each of these files, I want to store some log info for my program like the function prototype that acts,etc. Usually I use the hard way of fopen("log/***","a") which is not for this purpose.And I just write a timestamp function:

char* timeStamp(char* txt){
  char* rc;
  char timestamp[16];
  time_t rawtime = time(0);
  tm *now = localtime(&rawtime);

  if(rawtime != -1) {
     strftime(timestamp,16,"%y%m%d_%H%M%S",now);
     rc = strcat(txt,timestamp);
  }
  return(rc);
}

But I don't know what to do next. Please help me with this!

Upvotes: 3

Views: 16233

Answers (4)

Timothy Pratley
Timothy Pratley

Reputation: 10662

Sounds like you have mostly solved it already - to create a file like you describe:

char filename[256] = "log/";
timeStamp( filename );
f = fopen( filename, "a" );

Or do you wish do do something more?

Upvotes: 1

Christoph
Christoph

Reputation: 169553

What about this:

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

#define LOGNAME_FORMAT "log/%Y%m%d_%H%M%S"
#define LOGNAME_SIZE 20

FILE *logfile(void)
{
    static char name[LOGNAME_SIZE];
    time_t now = time(0);
    strftime(name, sizeof(name), LOGNAME_FORMAT, localtime(&now));
    return fopen(name, "ab");
}

You'd use it like this:

FILE *file = logfile();
// do logging
fclose(file);

Keep in mind that localtime() is not thread-safe!

Upvotes: 3

Chris Lutz
Chris Lutz

Reputation: 75389

Declare a char array big enough to hold 16 + "log/" (so 20 characters total) and initialize it to "log/", then use strcat() or something related to add the time string returned by your function to the end of your array. And there you go!

Note how the string addition works: Your char array is 16 characters, which means you can put in 15 characters plus a nul byte. It's important not to forget that. If you need a 16 character string, you need to declare it as char timestamp[17] instead. Note that "log/" is a 4 character string, so it takes up 5 characters (one for the nul byte at the end), but strcat() will overwrite starting at the nul byte at the end, so you'll end up with the right number. Don't count the nul terminator twice, but more importantly, don't forget about it. Debugging that is a much bigger problem.

EDIT: While we're at it, I misread your code. I thought it just returned a string with the time, but it appears that it adds the time to a string passed in. This is probably better than what I thought you were doing. However, if you wanted, you could just make the function do all the work - it puts "log/" in the string before it puts the timestamp. It's not that hard.

Upvotes: 3

Sauron
Sauron

Reputation: 16903

Steps to create (or write to) a sequential access file in C++:

1.Declare a stream variable name:

ofstream fout;  //each file has its own stream buffer

ofstream is short for output file stream fout is the stream variable name (and may be any legal C++ variable name.) Naming the stream variable "fout" is helpful in remembering that the information is going "out" to the file.

2.Open the file:

fout.open(filename, ios::out);

fout is the stream variable name previously declared "scores.dat" is the name of the file ios::out is the steam operation mode (your compiler may not require that you specify the stream operation mode.)

3.Write data to the file:

fout<<grade<<endl;
fout<<"Mr";

The data must be separated with space characters or end-of-line characters (carriage return), or the data will run together in the file and be unreadable. Try to save the data to the file in the same manner that you would display it on the screen.

If the iomanip.h header file is used, you will be able to use familiar formatting commands with file output.

fout<<setprecision(2);
fout<<setw(10)<<3.14159;

4.Close the file:

fout.close( );

Closing the file writes any data remaining in the buffer to the file, releases the file from the program, and updates the file directory to reflect the file's new size. As soon as your program is finished accessing the file, the file should be closed. Most systems close any data files when a program terminates. Should data remain in the buffer when the program terminates, you may loose that data. Don't take the chance --- close the file!

Upvotes: 1

Related Questions