2009-09-15 41 views
2

我想在“log”目录下创建一系列文件,每个文件根据执行时间命名。在这些文件中,我想为我的程序存储一些日志信息,例如行为的函数原型等。 我通常使用的FOPEN硬盘的方式(“登录/ ***”,“A”),这是不是这个purpose.And我只写一个时间戳功能:如何创建以当前时间命名的文件?

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); 
} 

但我不知道接下来做什么。请在这件事上给予我帮助!

+8

C和C++将为您提供根本不同的答案... – GManNickG 2009-09-15 05:23:04

+0

+1给GMan。我给了你一个C的答案(没有代码,对不起 - 这是你的工作),但如果你想要一个C++的答案,不要标记C(反之亦然)。他们是两种不同的语言。仅仅因为一个是另一个(大部分)严格的超集,并不意味着你应该把它们合并为一个整体。 – 2009-09-15 05:25:31

+0

对不起,我只是想解决这个问题,无意指定语言。 – iBacchus 2009-09-15 05:32:01

回答

3

声明一个char阵列大到足以容纳16 + "log/"(所以20个字符),并把它初始化为"log/"然后用strcat()或什么要补充的通过你的函数返回到您的数组的结束时间字符串相关。你去了!

注意字符串加法的工作原理:您的char数组是16个字符,这意味着您可以输入15个字符加上一个空字节。重要的是不要忘记这一点。如果您需要16个字符的字符串,则需要将其声明为char timestamp[17]。请注意,"log/"是一个4个字符的字符串,因此它占用5个字符(一个用于最后的nul字节),但strcat()将覆盖,最后的nul字节从开始,所以您将最终以右数。不要数两次终结者,但更重要的是,不要忘记它。调试是一个更大的问题。

编辑:虽然我们在它,我误解你的代码。我认为它只是随时间返回一个字符串,但它似乎将时间添加到传入的字符串中。这可能比我认为的要好。然而,如果你愿意,你可以让这个函数完成所有的工作 - 在放入时间戳之前,它将"log/"放入字符串中。这并不难。

+0

非常感谢! – iBacchus 2009-09-15 05:54:25

1

听起来像你大多解决它已经 - 给像你描述的创建一个文件:

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

或者你希望你做更多的事情?

+0

为什么不只是'char filename [256] =“log /”;'? – 2009-09-15 05:26:05

+0

更改为使用snprintf,strncat和朋友,我会给你一个+1。不要鼓励缓冲区溢出 – 2009-09-15 06:18:23

+1

谢谢,你是正确的。 – 2009-09-15 23:30:38

1

步骤在C++创建(或写入)一个顺序访问的文件:

1.Declare流变量名:

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

ofstream的是短期的输出文件流 Fout为流变量名称 (并且可能是任何合法的C++变量名称)。 命名流变量“fout”有助于记住 信息将“出”到文件中。

2.Open该文件:

fout.open(文件名,IOS ::出);

FOUT是先前声明流变量名 “scores.dat”是文件 IOS的​​名字::出来的蒸汽操作模式 (你的编译器可能不要求您指定 流操作模式。 )

3。将数据写入到文件中:

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

的数据必须与空格字符或结束行字符(回车)分离,或者数据将在文件中同时运行并且是不可读。尝试按照您在屏幕上显示的方式将数据保存到文件中。

如果使用iomanip.h头文件,您将能够使用熟悉的格式化命令和文件输出。

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

4.Close文件:

fout.close(); 

关闭文件写入保留在缓存的文件中的任何数据,释放从程序文件,并更新文件目录,以反映该文件的新尺寸。只要您的程序完成访问该文件,该文件应该关闭。大多数系统在程序终止时关闭任何数据文件。如果数据在程序终止时保留在缓冲区中,您可能会丢失该数据。别抓住机会---关闭文件!

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()不是线程安全的!

相关问题