请问sprintf、fprintf和printf这三个函数有什么区别?

请问sprintf、fprintf和printf这三个函数有什么区别?,第1张

sprintf、fprintf和printf这三个函数区别为:输出不同、参数不同、重定向不同。

一、输出不同

1、sprintf函数:sprintf函数是把格式字符串输出到指定文件设备中。

2、fprintf函数:fprintf函数是把格式字符串输出到指定字符串中。

3、printf函数:printf函数是把格式字符串输出到标准输出中。

二、参数不同

1、sprintf函数:sprintf函数参数比printf多一个char*。

2、fprintf函数:fprintf函数参数比printf多一个文件指针FILE*。

3、printf函数:printf函数参数为字符串string。

三、重定向不同

1、sprintf函数:sprintf函数不可以重定向。

2、fprintf函数:fprintf函数不可以重定向。

3、printf函数:printf函数可以重定向。

sprintf是C语言标准库提供的函数, 包含在stdio.h中, 只要在文件头#include <stdio.h>即可.

原型为int sprintf ( char * str, const char * format, ... )

用于按格式化方式(%d %f %c %s等)将数据写入字符串.

PS. 用sprintf记得考虑写入内存区域的大小问题, 小心别越界了. 可换用snprintf, 加一个参数后不易出错.

你只要取多行是不?

我给你一段代码参考

while (OCIStmtFetch(env->stmthp, env->errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)

{

count = data->num_column

DataLink = (CHECK_DATA *) malloc(sizeof(CHECK_DATA))

len = 0

if(data->num_column >1)

{

while (count--)

{

sprintf(&((DataLink->buf)[len]), "%s%c", data->buf[count],'$')

len += strlen(data->buf[count])+1

}

}

else

sprintf(DataLink->buf, "%s", data->buf[0])

DataLink->next = NULL

DataLink->next = head->next

head->next = DataLink

data->num_row++

}

这个就是循环取数据

只是我这里用了链表 和把多个字段合成一个字段存入到了链表 取出来用的时候再把多个字段分离

这个fetch 函数的参数 OCI_FETCH_NEXT, 表示一次 取一条数据 不管你有多少列 一次取一条记录 具体列数通过它返回的结构体力的num_column取得/

另外你所说的批量插入是啥意思 我后台程序 每30秒插入一次数据一次插入4096条,貌似没有什么批量的概念。我不懂你的意思 我给你我插入数据的代码demo

int oci_excu(OCI_ENV *env,text *sql,int flag)

{

/******** OCIStmtPrepare() 解析SQL语句 **********/

if(OCIStmtPrepare(env->stmthp, env->errhp, sql, (ub4)strlen((char *)sql), OCI_NTV_SYNTAX, OCI_DEFAULT))

return 0

/******** OCIStmtExecute() 执行SQL语句 **********/

if(OCIStmtExecute(env->svchp, env->stmthp, env->errhp, (ub4) 1, (ub4) 0,(CONST OCISnapshot *) NULL,(OCISnapshot *) NULL, OCI_DEFAULT | OCI_COMMIT_ON_SUCCESS))

return 0

/******** OCITransCommit() 进行事务的提交,不提交回滚 **********/

if(flag)

{

if(OCITransCommit(env->svchp,env->errhp,(ub4)0))

return 0

}

return 1

}

if (distance >0.0001)

{

sprintf(tName,"GPS_%d_Y",tf[k]) // 数据库表名

InsertHash(temp, pHash, MAX_REC<<2) // 插入

if(interval == 0 || interval >420)

node = 1

else

node = 0

sprintf(sql,"insert into %s (id,tm_id,lon,lat, speed,utc_time,udate,mileage,DIRECTION,DISTANCE,INTERVAL,node,term_stat,RESERVE,reserve1) values (seq_gps.nextVal,'%s','%f','%f','%f','%d','%d','%f','%d','%f','%d','%d','%d','%s','%s')",

tName,GpsRec[i].tid,GpsRec[i].lon,GpsRec[i].lat,GpsRec[i].speed,GpsRec[i].utime,GpsRec[i].udate,GpsRec[i].mileage,GpsRec[i].dir,distance,interval,node,GpsRec[i].stat,GpsRec[i].alltime,dirc[GpsRec[i].dir])

// printf("%s\n",sql)

sem_wait(&sem_or) // 挂起信号

oci_excu(oracle_env,(text *)sql,0) // 插入数据

sem_post(&sem_or) // 信号解锁

memset(tName,0x00,10)

}

循环插入数据即可 你所指批量莫非就是这个意思? 另外OCIDefineByPos 这个函数的介绍随便百度下好像都解释的很清楚了 你不明白的地方是哪里??


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10842829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存