当前位置: 首页 > article >正文

linux软件编程-IO

函数接口

1.fputs()

fputs
    int fputs(const char *s, FILE *stream);
    功能
           向流中写入一行字符串       
    参数: s 
               要写的信息,一般是固定的字符串或者有数据的数组。
           stream 
               要写入的目标文件流对象

    返回值:如果操作成功,函数返回一个非负值;如果发生错误,则返回EOF1
            即 -1;
    注:
        不写入 '\0' 
    puts和fputs的区别:
        1.fputs不会自动增减\n
        2.puts 会多打印\n字符


2.fgets() 

    fgets
    //按行读写   按字符串读写 
    fgets  -- char ---> string 
    fputs  -- char ---> string

    char *fgets(char *s, int size, FILE *stream);
    功能:
          从stream流对象关联的文件中获取size大小字节的文本数据
      并存储到s对应的本地内存(栈区数组,堆区内存)
    参数:

         1. s    要存储数据的本地内存(栈,堆)
         2.  size 要获取的数据长度,单位字节。
         3. stream 要获取的目标文件流对象,可以是stdin ,程序会阻塞等待;
                          如果是普通文件fp 则指向文件第一行数据
    返回值成功 返回指向有效数据的首地址,一般等于s的地址
                  失败 或者 文件末尾 NULL;

        注意:
        1.fgets能读取一行就读取一行
        2.fgets会读到n个数据,如果n个数据中存在\n字符则立即停止当
          前的读取操作,如果没有\n,则读取n-1个字符,最后一个存储\0    
        3.fgets每行读取的数据后面都有一个\n,在\n后面存放一个\0
                     12345
            buf[] = '1''2''3''4''5''\n''0'

        4.gets是危险的,因为没有规范读到数据的上限              
        5.gets会去掉从终端读入的\n字符 //也读走了\n 但是将 \n 去掉了 \n --> '\0

 puts和fputs的区别:
        1.fputs不会自动增减\n
        2.puts 会多打印\n字符


二进制文件读写:  fread()/fwrite()

1.fread()

size_t  fread(void  *ptr,  size_t size, size_t nmemb, FILE *stream);
功能:
      从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr
      所在的本地内存中。
参数:
      ptr    要存储数据的本地内存一般是数组或者结构体指针
      size   单个数据块的元数据大小。最小单元的大小
      nmemb  要获取的数据块的个数,拷贝的数据块个数。
      stream 要获取数据的源文件流对象,如果是stdin表示从
      键盘获取数据,如果是fp文件则表示从普通文件获取。
返回值:
        成功 小于等于nemeb的整数,表示获取的数据长度
        失败 小于0,结尾 0;


2.fwrite() 

写:
size_t fwrite(const void  *ptr,  size_t  size,size_t nmemb, FILE *stream);
功能:
      从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应
      的文件流对象中。
参数

      ptr 要写的数据块地址,一般是数组或者结构体指针
      size  要写的数据块元数据大小,单位是字节
      nmemb 要写的数据块的个数
      stream 要写的目标文件流对象。如果是stdout则表示数据会
      写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。

返回值

              成功 小于等于nmemb 的个数。
              失败 <0


定位操作:标准IO之文件定位函数:fseek ,ftell  ,rewind

1.fseek()

    fseek
    int fseek(FILE *stream, long offset, int whence);//long -->signed long 

    功能:
          将stream流文件中的文件指针
          从whence位置开始
          偏移offset字节的长度。
    参数:
          stream  要移动文件指针的目标文件流对象。 
               注意:不支持设备文件,一般用于普通文件。  
          offset  
                  要在文件内偏移的距离,单位字节。
                  如果值为整数,则向文件末尾偏移
                  如果值为负数,则向文件开头偏移
          whence  偏移的起始位置,由系统定义的三个宏开始。
            SEEK_SET  文件的开头位置   offset 只能是正值 
            SEEK_CUR  文件的当前位置   offset 可正可负, 但是如果当前位置与 SEEK_SET重合 offset 不能是负的
            SEEK_END  文件的末尾位置   offset 可正 可负 
                                       正 --- 空洞文件 
    返回值:    
        成功: 返回 0
        失败:  -1;
        fseek(fp,100,SEEK_SET); //从头开始往后偏移100个字节 


2.ftell() 

ftell
        long ftell(FILE *stream);
        功能:获取文件位置指示器的偏移量
        参数:求偏移量的文件流指针
        返回值:文件位置指示器到文件开头的偏移字节数


3.rewind() 

      rewind(fp);
      void rewind(FILE *stream)
        功能:
             获取当前文件流指针的具体位置,
             一般以文件开头到当前指针的字节数为返回值       
        参数:stream 要返回指针距离的文件流对象
        返回值:void



rewind()  等效于:
fseek(stream,0L,SEEK_SET);

缓冲区

#include<stdio.h>
#include<unistd.h>
 
int main(int argc, char const *argv[])
{
    FILE *p=fopen("1.txt","w");
 
    #if 0
    fputs("hello\n",p);//在缓冲区里
 
    while (1);
   #endif
#if 1
    for(int i=0;i<4096;i++)//缓冲区满则刷新
    {
        fputc('a',p);
    }
 
    sleep(3);
 
    fputc('a',p);//
 
    while(1);
#endif
 
#if 0
    fputs("hello",p);
    fflush(p);//刷新缓冲区
    while(1);
#endif
    return 0;
}

     行缓冲,1k,terminal,主要用于人机交互stdout

缓存区满或者遇到\n刷新 1024
        行缓存多是关于终端的一些操作
        1.遇到\刷新
        2.缓存区满刷新
        3.程序结束刷新
        4.fflush刷新 fflush(stdout); FlLE*fp  stdin stdout stderr


    全缓冲,4k,主要用于文件的读写
缓存区满刷新缓存区 4096
        对普通文件进行标准I0操作,建立的缓存一般为全缓存
        刷新条件:
        1.缓存区满刷新
        2.程序结束刷新
        3.fflush来刷新 fflush(fp);


    无缓冲,0k

主要用于出错处理信息的输出 stderr不对数据缓存直接刷新
        printf();==>>stdoutfprintf(strerr,"fopen error %s",filename);

        界面交互 出错丛理使用qdb查看,FILE结构体,或使用写入数据测试缓冲区。缓冲区的大小是可以设置

     


 

 


http://www.kler.cn/a/549074.html

相关文章:

  • 论文阅读_用于低频隔振的高负刚度新型阵列磁性弹簧的分析与设计_3
  • 基于Yolo11的无人机小目标检测系统的设计与性能优化改进项目实现
  • mysql索引为什么用B+树,不用二叉树
  • JavaScript系列(68)--运行时优化技术详解
  • 用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理
  • Java语言在微服务架构中的应用研究
  • Leetcode 712. Minimum ASCII Delete Sum for Two Strings
  • Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改
  • 卓越设计彰显品质:福特中国“烈马宇宙”项目展示高质量标准
  • AI大模型学习(一)
  • Windows环境安装部署minimind步骤
  • 民用无人驾驶航空器操控员考试
  • 连锁企业管理系统的五大核心功能
  • Linux-ubuntu系统移植之Uboot作用以及相关命令
  • 蓝桥杯 Java B 组 之队列的应用(BFS 入门)
  • ai时代我们面临的机遇和挑战是什么
  • 用C++实现点到三角形最小距离的计算
  • 基于Spring Boot的家电销售展示平台设计与实现(LW+源码+讲解)
  • CI/CD(二)docker-compose安装Jenkins
  • C++11 thread