千家信息网

Linux 标准I/O库常用函数总结

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,上一篇总结了文件I/O的系统调用,今天来总结下标准I/O库在工作几年经常使用的函数。标准I/O库(#include)实际就是封装了系统调用;这样做的主要目的是减少对系统调用的调用,从而提高效率。1、流
千家信息网最后更新 2026年11月03日Linux 标准I/O库常用函数总结

上一篇总结了文件I/O的系统调用,今天来总结下标准I/O库在工作几年经常使用的函数。

标准I/O库(#include)实际就是封装了系统调用;这样做的主要目的是减少对系统调用的调用,从而提高效率。

1、流和FILE对象

文件I/O操作的的文件描述符,而标准I/O库操作的是流即就是FILE对象。当打开一个流时,返回一个FILE对象。

2、标准输入、标准输出、标准错误

对应文件I/O的文件描述符文件为:0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO)

对应标准I/O库的流为:stdin、stdout、stderr;

3、标准I/O提供三种缓冲(减少对系统调用的调用)

    int setbuf(FILE *stream,char *buf );/*buf =null 关闭缓冲,buf长度=BUFSIZE设置缓冲区*/    int setvbuf(FILE *stream,char *buf,int mode,size_t size);/*mode :_IOFBF 全缓冲;_IOLBF行缓冲;_IONBF不带缓冲。长度为size 的buf,如果buf=NULL,则为系统默认大小。*/    int fflush(FILE*fp);/*强制刷新一个流,用于刷新缓冲区*/

1) 全缓冲:当不涉及到交互式设备时,则为全缓冲。

2) 行缓冲:终端设备一般是行缓冲。有时不需要缓冲区,比如之前例子里,需要实时打印printf,所以要讲其设置成不带缓冲:

      setvbuf(stdout,NULL,_IONBF,0)

3) 不带缓冲:标准出错就是不带缓冲,当出现错误的时候会立即输出。

4、 打开和关闭流

    FILE *fopen(const char *path,const char *mode);    FILE *fdopen(int fd,const char *mode);    FILE *freopen(const char *path,const char *mode,FILE *stream);

三个函数都是打开一个流,fopen:打开一个指定的流;fdopen:流和一个文件描述符结合;freopen:在一个指定的流上打开一个指定的文件,已打开则关闭、已定向则消除。

mode:r读、r+读写、w写、w+读写、a在文件尾部写、a+在文件尾部读和写。

int fclose(FILE *stream);/*关闭一个流*/

5、读和写流

读和写流分为三种:每次一个字符的I/O;每次一行的I/O;直接I/O(二进制I/O)按字节操作。

1) 字符I/O

读函数:

    int getc(FILE *fp);    int fgetc(FILE *fp);    int getchar(void);/*getc(stdin)*/

因为要判断出错或者是不是到了流的末端(EOF = -1),所以返回值都是整型。

用函数:int ferror(FILE *fP)/*未出错返回0*//int feof(FILE *fp)/*返回0表示文件未结束*/

写函数:

    int putc(int c,FILE *fp);    int fputc(int c,FILE *fp);    int putchar(int c);/*putc(c,stdout)*/

2) 行I/O

读函数:

    char *fgets(char *buf,int n,FILE *fp);/*读到下一个换行符如果buf够大,如果buf没有一行大,返回一个不完整的行,下次继续读改行*/    char *gets(char *buf);/*从stdin读*/

写函数:

    char fputs(char *buf,FILE *fp);    char puts(char *buf);/*写到stdout*/

3) 二进制I/O

    size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream );    size_t fwite(const void*ptr,size_t size,size_t nmemb,FILE *stream);

/*size指定ptr长度,nmemb指定读或者写几个size长度的ptr*/

工作中经常从flash读出设备的镜像:

/*read boot & image*/cs_status cs_build_image(){    cs_uint32 offset = 0;    int ret = 0;    FILE *  bootfp = NULL;    FILE *  imgfp = NULL;    ULONG   lByte = 0;                  /*读取文件时的单元长度*/    UCHAR   ucBuffer[1024] = {0};/*用来存储读出来镜像单元*/    ULONG   ulImageLen = 0;                    /*记录文件的总体长度*/    UCHAR   uc8124imgName[48] = {0};          /*local file name*/    UCHAR   uc8124stage2ImgName[48] = {0};          /*local file name*/    UCHAR   head = 64;    sprintf( uc8124stage2ImgName, "/ram0/%s", "stage2" );    if( NULL == ( bootfp = fopen( uc8124stage2ImgName, "wb+" ) ) )    {        printf( "open to  cs8124_img file!\r\n" );        return ERROR;    }    ret = GenHwSysFlashload8124Stage2Image(bootfp);    if( OK != ret )    {        printf( "read 8124Stage2Image from flash error! \r\n" );        return ERROR;    }    g_uc8124stage2Image = (cs_uint8*)malloc(sizeof(cs_uint8) * TEST_MAX_OLT_LOADER_IMAGE );    if(g_uc8124stage2Image == NULL){        printf("malloc g_uc8124stage2Image error\n");    }    memset(g_uc8124stage2Image, 0, TEST_MAX_OLT_LOADER_IMAGE);    fseek( bootfp, 0, SEEK_SET );    while( 0 < ( lByte = fread( ucBuffer, 1, 1024, bootfp ) ) )    {                ulImageLen += (lByte-head);                /*写在本地文件操作*/        memcpy( g_uc8124stage2Image + offset, ucBuffer+head , lByte-head );                offset += lByte-head;                memset( ucBuffer, 0 , sizeof( ucBuffer ) );                head = 0;    }    printf("[%s%d ] g_uc8124stage2Image:%d\n",__FILE__,__LINE__,ulImageLen);    g_ucStage2ImageLen = ulImageLen;    if(TEST_MAX_OLT_LOADER_IMAGE < ulImageLen){        return ERROR;    }    fclose( bootfp);    ret = remove( uc8124stage2ImgName );    if( OK != ret  )    {        printf( " 8124stage2Image error! \r\n" );        return ERROR;    }           /*get cs8124 image(firmware)*/            sprintf( uc8124imgName, "/ram0/%s", "imgenew" );    if( NULL == ( imgfp = fopen( uc8124imgName, "wb+" ) ) )    {        printf( "Fail to create cs8124_img file!\r\n" );        return ERROR;    }    ret = GenHwSysFlashload8124Image(imgfp);    if( OK != ret )    {        printf( "read 8124Image from flash error! \r\n" );        return ERROR;    }    g_ucpOltImage = (cs_uint8*)malloc(sizeof(cs_uint8) * TEST_MAX_OLT_IMAGE );    if(g_ucpOltImage == NULL){    printf("malloc g_ucpOltImage error\n");    }    memset(g_ucpOltImage, 0, TEST_MAX_OLT_IMAGE);    fseek( imgfp, 0, SEEK_SET );    lByte = 0;    ulImageLen = 0;    offset = 0;    head = 64;    memset( ucBuffer, 0 , sizeof( ucBuffer ) );    while( 0 < ( lByte = fread( ucBuffer, 1, 1024, imgfp ) ) )    {        ulImageLen += (lByte-head);        /*写在本地文件操作*/        memcpy( g_ucpOltImage + offset, ucBuffer+head , lByte-head );        offset += lByte-head;        memset( ucBuffer, 0 , sizeof( ucBuffer ) );        head = 0;    }    printf("[%s%d ] g_ucpOltImage len:%d\n",__FILE__,__LINE__,ulImageLen);    g_ucOltImageLen = ulImageLen;    if(TEST_MAX_OLT_IMAGE < ulImageLen){        return ERROR;    }    fclose( imgfp);    ret = remove( uc8124imgName );    if( OK != ret )    {        printf( " uc8124imgName error! \r\n" );        return ERROR;    }    }

6、 定位流函数

int fseek(FILE *fp,long offset,int whence);/*和文件I/Olseek函数类似,whence相同:SEEK_SET从文件起始开始,SEEK_CUR从文件当前开始,SEEK_END从文件末端开始*/

7、 格式化I/O

格式化输出函数:

    int printf(const char *format,….);    int fprintf(FILE *fp,const char *format,….);    int sprintf(char *buf,const char *format,…);    int snprintf(char *buf,size_t n,const char *format,…);

/*printf将格式化数据写到标准输出,fprintf写到指定的流,sprintf将格式化的字符串送到数组buf中。snprintf指定buf长度n*/

在工作中经常使用snprintf,比如刚刚开发完静态路由是用到的:

格式化输入函数(和输出类似):

    int scanf(const *format,…);    int fscanf(FILE *fp,const *format,..);    int sscanf(const char *buf,const char *format,…);

8、创建临时文件函数

    FILE *tmpfile(void);/*创建一个临时二进制文件wb+,在关闭该文件或程序结束时将自动删除这种文件*/


文件 缓冲 函数 标准 长度 格式 系统 输出 二进制 字符 对象 就是 缓冲区 设备 工作 一行 单元 尾部 末端 错误 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中国互联网科技股 鸠鸠互联网科技 合肥互联网科技公司 青岛互联网科技公司 善班互联网科技有限公司 上海亿帐通互联网科技 深圳卡尔迅互联网科技有限公司怎么样 海南购全球互联网科技 佩信高科技互联网 须眉科技是互联网公司吗 呼和浩特新华互联网科技学院 链环科技传统企业怎么转型互联网 科技类公司包括互联网吗 东莞新华互联网科技学校 伊宁互联网科技做什么的 锡山区互联网智能科技产品供应 黑云互联网科技有限公司 35岁以上互联网科技行业 互联网科技包装股份有限公司上市 求路客互联网科技电话 苏州找大状互联网科技有限公司 互联网属科技 重庆互联网络科技 美国互联网黑科技 青岛中康互联网医疗科技有限公司 华服互联网科技官网 互联网还是高科技吗 互联网金融科技展 互联网在线教育科技创业 杭州科技互联网公司有哪些
0