很多时候我们需要写入数据到文件中时都觉得很困扰,因为格式乱七八槽的,可读性太差了,于是我们就想有没有什么函数可以格式化的从文件中输入和输出呢,还真有。
下面我将讲解一下fscanf和fprintf与sprintf()的强大之处。
1、fscanf(可以从一个文件流中格式化读出数据,遇到空格或回车就停止)
原型: int fscanf(FILE *stream, const char *format, ...); //fscanf(文件流指针,格式字符串,输出表列);
参数:
FILE *stream :文件流指针
const char *format, ... :字符串的格式
例子 :
fscanf(fp,"%s %s %d",new1->number,new1->staddress,&new1->price);(这样写的话数据输入到文件中时每个数据中间就会有一个空格)
或者写成:
fscanf(fp,"%s,%s,%d",new1->number,new1->staddress,&new1->price);(这样写的话数据输入到文件中时每个数据中间就会有一个‘,’)
2、fprintf(可以向一个文件中格式化写入数据)
原型: int fprintf(FILE *stream, const char *format, ...); //fprintf(文件流指针,格式字符串,输出表列);
参数:
a、FILE *stream :文件流指针
b、const char *format, ... :字符串的格式
例子 :
fprintf(fp,"%s %s %d\n",new->number,new->staddress,new->price); //同上
或者写成:
fprintf(fp,"%s,%s,%d\n",new->number,new->staddress,new->price); //同上
3,sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。
头文件
原型
参数列表
返回值
char buf[100]; //开辟缓存,保存设备信息 bool FindInfo(LLONG loginId) { printf("%ld\n", loginId); char cmd[] = CFG_CMD_REMOTEDEVICE; //输出缓冲的大小可能需要调节 int nError = 0; char buf[1024 * 16] = {0}; DWORD bufSize = 1024 * 16; bool ret = CLIENT_GetNewDevConfig(loginId, cmd, -1, buf, bufSize, &nError); if (!ret) { printf("cfg error %d\n", nError); } printf("cfg %ld %ld\n", strlen(buf), sizeof(AV_CFG_RemoteDevice)); AV_CFG_RemoteDevice *tmp = new AV_CFG_RemoteDevice[16]; memset(tmp, 0, sizeof(*tmp) * 16); for (int i = 0; i < 16; i++) { tmp[i].nStructSize = sizeof(tmp[i]); //结构体大小赋值 } // 返回IP数组 和 端口数组,在python中打包成json返给前端 DWORD tmpSize = 1024 * 16; ret = CLIENT_ParseData(cmd, buf, (LPVOID)tmp, tmpSize, 0); if (!ret) { printf("parse error %d\n", CLIENT_GetLastError()); } FILE *fp = fopen("./test.txt","a+"); //以读写的权限打开文件(如果文件不存在则创建),这里用w+实现之前的清除最好 int buf_lx = 0; for (int i = 0; i < 16; i++) { if(tmp[i].bEnable) { //输出到缓存 buf_lx += sprintf(buf+buf_lx, "%s,%d,%d\n",tmp[i].szIP,tmp[i].nPort,i); printf("%s----%d---%d\n",tmp[i].szIP,tmp[i].nPort, i ); if(fp == NULL) { perror("fopen"); return -1; } //输出到文件 fprintf(fp,"%s,%d,%d\n",tmp[i].szIP,tmp[i].nPort,i); } } fclose(fp); //关闭文件 printf("%s",buf); //打印缓存看看效果 printf("done!\n");