c语言将格式化字符串输入到文件或者缓存

本文介绍了C语言中用于格式化输入和输出的函数fscanf、fprintf和sprintf。fscanf可以从文件流中按指定格式读取数据,fprintf则可以向文件流中格式化写入数据,而sprintf则将格式化的数据写入字符串。通过示例,展示了如何使用这些函数在文件中插入和读取带有分隔符的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       很多时候我们需要写入数据到文件中时都觉得很困扰,因为格式乱七八槽的,可读性太差了,于是我们就想有没有什么函数可以格式化的从文件中输入和输出呢,还真有。

下面我将讲解一下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溢出的可能性。

头文件

原型

int sprintf( char *buffer, const char *format, [ argument] … );

参数列表

bufferchar型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument].. .:可选参数,可以是任何类型的数据。

返回值

返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。
sprintf 返回以format为格式argument为内容组成的结果被写入buffer 的字节数, 结束字符‘\0 ’不计入内。即,如果“Hello”被写入空间足够大的buffer后,函数sprintf 返回5
用法:
 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");    






### C语言文件输入输出操作 #### 默认标准流 C语言程序默认提供三个预定义的标准I/O流:`stdin`, `stdout`, 和 `stderr`. 这些流分别对应键盘输入、屏幕输出以及错误消息输出,在程序启动时自动创建,无需显式调用打开函数即可使用[^1]. #### 使用格式化读写函数处理文件 对于更复杂的文件操作,则需利用特定的库函数来实现。例如,`fprintf()` 函数允许向指定文件中写入经过格式化字符串;而 `fscanf()` 则可以从给定文件里按照设定好的模式读取数据[^2]. 下面给出一段简单的代码片段展示如何运用这两个功能: ```c #include <stdio.h> int main() { FILE *file; char data[100]; file = fopen("example.txt", "w+"); if (file != NULL){ // 向文件中写入一些文本 fprintf(file, "%s %d %.2f\n", "Price:", 49, 87.5); rewind(file); // 将文件位置指针移回起始处 // 从文件中读取一行内容至data数组内 fscanf(file, "%s %[^\n]", &data); printf("%s\n", data); fclose(file); } return 0; } ``` 此段代码首先打开了名为 `"example.txt"` 的文件,并设置为可读写的二制方式 (`"w+"`) 。接着通过 `fprintf()` 方法往该文件里面入了一条记录,之后借助于 `rewind()` 把当前访问的位置重置到了文档头部以便后续能够正常地从中提取信息。最后采用 `fscanf()` 来解析储的数据并将其打印出来。 #### 缓冲区管理 当涉及到缓冲机制时,像 `fflush()` 可用来强制刷新输出缓存,使得尚未写出的内容立即被提交到目标设备上去。另一方面,假如希望把文件内部定位器调整回到最前面的话可以考虑应用 `rewind()` 函数[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值