曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6336|回复: 0
打印 上一主题 下一主题

[文件I/O] vprintf() 函数族

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-7-13 21:27:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
vsprintf() 函数 和  vfprintf() 函数的原型为
#include <stdio.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
这两个函数对应于 printf() 和 vprintf() 函数,其函数名前面都有 v 字符。在传递参数时,都需要传递 va_list 类型参数。

测试代码-1
#include <stdarg.h>
#include <stdlib.h>

FILE *printer;
FILE *logfile;

int xprintf(const char *format, ...)
{
        va_list ap;
        va_start(ap, format);

        vprintf(format, ap);
        if(printer)
          vfprintf(printer, format, ap);
        if(logfile)
          vfprintf(logfile, format, ap);

        va_end(ap);
}
/*
int old_xprintf(const char *format, long a1, long a2, long a3, long a4,
                long a5, long a6, long a7, long a8)
{
        printf(format,a1, a2, a3, a4, a5, a6, a7, a8);
        if(printer)
          fprintf(printer, format, a1, a2, a3, a4, a5, a6, a7, a8);
        if(logfile)
          fprintf(logfile, format, a1, a2, a3, a4, a5, a6, a7, a8);

}
*/


int main(void)
{
        int a1 = 1, a2 = 2, a3 = 3, a4 = 4, a5 = 5, a6 = 6, a7 = 7, a8 = 8,
            a9 = 9;

        printer = fopen("test", "w+");
        logfile = fopen("test2", "w+");

//      old_xprintf("%d,%d,%d,%d,%d,%d,%d,%d\n", a1, a2, a3, a4, a5, a6, a7, a8);      
        xprintf("kkkkkkk%d,%d,%d\n", a1, a2,a4,a5);

        fclose(printer);
        fclose(logfile);
        return 0;
}
运行及其输出
beyes@linux-beyes:~/C/base> ./vsprintf.exe
kkkkkkk1,2,4
beyes@linux-beyes:~/C/base> cat test
kkkkkkk1,2,4
beyes@linux-beyes:~/C/base> cat test2
kkkkkkk1,2,4
说明
vp 对应于传递给 xprintf 函数中的 ... 号表示的参数列表。va_start() 这个宏会分析并展开这个参数列表。由于 xprintf 的第一个字符串参数中只指定了3个 %d ,那么在参数列表后即使指定了 4 个参数,那么最后一个参数 a5 会因为没有匹配项而没有输出。

假如修改 %d 的个数多于参数列表中的参数个数,那会怎么样呢?将上面程序中调用的 xprintf() 改为 xprintf("kkkkkkk%d,%d,%d\n", a1);
经编译运行输出为
beyes@linux-beyes:~/C/base> ./vsprintf.exe
kkkkkkk1,0,0
由输出可见,如果第一个字符串参数中的内置类型(%d,%c等)项数多于参数列表中的参数个数,那么在输出时,多出部分用 0 来表示。

另外,vfprintf() 函数和 vprintf() 不同在于 vprintf() 输出到标准输出中,而 vfprintf() 输出到文件流指针所指向的文件里。

关于 va_start() 这些宏见:http://www.groad.net/bbs/read.php?tid=947
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 12:02 , Processed in 0.118787 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表