我想在“log”目录下创建一系列文件,每个文件根据执行时间命名。在每个文件中,我想为我的程序存储一些日志信息,如行为的函数原型等。 通常我使用fopen的硬方式(“log / ***”,“a”),这不是为了这个目的。我只是写一个时间戳函数:
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);
}
但我不知道接下来该做什么。请帮帮我!
答案 0 :(得分:3)
声明一个char
数组大到足以容纳16 + "log/"
(总共20个字符)并将其初始化为"log/"
,然后使用然后你就去了!strcat()
或其他内容相关的是将函数返回的时间字符串添加到数组的末尾。
注意字符串添加是如何工作的:您的char
数组是16个字符,这意味着您可以输入15个字符加上一个空字节。重要的是不要忘记这一点。如果您需要16个字符的字符串,则需要将其声明为char timestamp[17]
。请注意,"log/"
是一个4个字符的字符串,因此它占用5个字符(一个用于结尾的nul字节),但strcat()
将覆盖从开始的nul字节最后,所以你最终会得到正确的数字。不要将nul终结器计算两次,但更重要的是,不要忘记它。调试是一个更大的问题。
编辑:当我们参与其中时,我误读了你的代码。我认为它只返回了一个带有时间的字符串,但似乎它为传入的字符串添加了时间。这可能比我想象的要好。但是,如果您愿意,您可以让函数完成所有工作 - 它会在放置时间戳之前将"log/"
放入字符串中。这并不难。
答案 1 :(得分:3)
这个怎么样:
#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");
}
你会这样使用它:
FILE *file = logfile();
// do logging
fclose(file);
请记住,localtime()
不是线程安全的!
答案 2 :(得分:1)
听起来你已经基本解决了它 - 创建一个你描述的文件:
char filename[256] = "log/";
timeStamp( filename );
f = fopen( filename, "a" );
或者你希望做更多的事情吗?
答案 3 :(得分:1)
在C ++中创建(或写入)顺序访问文件的步骤:
1.Declare流变量名:
ofstream fout; //each file has its own stream buffer
ofstream是输出文件流的缩写 fout是流变量名 (可能是任何合法的C ++变量名。) 命名流变量“fout”有助于记忆 信息将“输出”到文件中。
2.打开文件:
fout.open(filename,ios :: out);
fout是先前声明的流变量名 “scores.dat”是文件的名称 ios :: out是蒸汽操作模式 (您的编译器可能不需要您指定 流操作模式。)
3.将数据写入文件:
fout<<grade<<endl;
fout<<"Mr";
数据必须用空格字符或行尾字符(回车符)分隔,否则数据将在文件中一起运行并且不可读。尝试将数据保存到文件中,方法与在屏幕上显示的方式相同。
如果使用iomanip.h头文件,您将能够使用熟悉的格式化命令和文件输出。
fout<<setprecision(2);
fout<<setw(10)<<3.14159;
4.关闭文件:
fout.close( );
关闭文件会将缓冲区中剩余的所有数据写入文件,从程序中释放文件,并更新文件目录以反映文件的新大小。程序完成访问文件后,应立即关闭该文件。程序终止时,大多数系统会关闭所有数据文件。如果程序终止时数据仍保留在缓冲区中,则可能会丢失该数据。不要冒险 - 关闭文件!