记录数据。自定义fprintf - C.

时间:2014-04-04 19:30:14

标签: c string printf customization args

我想从我的程序中自定义输出到文件。

void http_log(char* msg, ...)
{
    char* prePend = "Date-Time: %s === ";//Prepended text
    size_t len1 = strlen(prePend);
    size_t len2 = strlen(msg);
    char *s = malloc(len1 + len2 + 1);  //The new string
    memcpy(s, prePend, len1);
    memcpy(s + len1, msg, len2 + 1); // includes terminating null

    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );

    char *dateTime = asctime (timeinfo);//Get the current date time
    dateTime[strlen(dateTime) - 1] = 0;//Take away the new line character 

    va_list args;
    va_start( args, msg);

    //I think the problem lies here... 
    fprintf( log_fd, s, dateTime, args);//Print it to the log file. log_fd is already created and opened.
    printf(s, dateTime, args);//Prints to screen. 

    va_end( args);
    free( s);
}

我想在http_log()的输出之前添加一些标准文本; (本例中的当前日期)。之后我想添加一些可自定义的文本,你传入http_log函数http_log(“这将在日期之后附加\ n”);.最后我希望能够使用%s,%d,%ld等(不知道它们被称为什么),如http_log(“连接IP地址%s \ n”,IP_addres); < / p>

我的问题是我传递的值不会打印出来。在我合并值之前,我应该尝试将字符串与值组合在一起吗? 或者我的代码还有其他一些问题吗?

我很感激所有的帮助&amp;&amp; || *指针

一些C乐趣:)

2 个答案:

答案 0 :(得分:2)

您无法将va_list args传递给printf(),而是传递给vprintf()。 并且您无法结合其他参数&#34; dateTimeva_list, 所以你必须单独打印它们:

void http_log(char* msg, ...)
{
    char *dateTime = ...;
    fprintf(log_fd, "Date-Time: %s === ", dateTime);
    printf("Date-Time: %s === ", dateTime);

    va_list args;

    va_start(args, msg);
    vfprintf(log_fd, msg, args);
    va_end( args);

    va_start(args, msg);
    vprintf(msg, args);
    va_end( args);
}

答案 1 :(得分:0)

我只有一次致电printf(),我才认为这是可能的。您的消息和参数必须传递到打印函数的v版本,vfprintf()。您必须将日期(或您想在http_log()内生成的任何内容)传递给打印函数的非v版本。