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

Linux中的标准IO【下】

标准IO

  • printf()
    • int printf(const char *format, …)//输出到标准IO端
    • int fprintf(FILE *stream, const char *format,…)//指定输出到一个流stream中
    • int sprintf(char *str, const char *format,…)//指定输出到一个字符串中
      • 最主要的是可以将多个不同格式的数据转化成字符串型
    • int atoi(char *ch)//将字符串转换为整型
    • int snprintf(char *str, size_t size, const char *format…)//防止溢出size就是str的大小
  • scanf()
    • int scanf(const char *format,…)
    • int fscanf(FILE *stream, const char *format,…)//从流中获得
    • int sscanf(const char *str, const char *format,…)//从字符串中获得
  • 文件位置指针—指向当前文件读取的位置,所在位置是当前位置,思考下面这个问题
    • 在一个文件中,我们利用fopen()打开文件后,用fputc(fp)读取10次,而后通过fgetc(fp)是否能得到输入那10次的数据?
    • 答案显然是否定的,因为,其文件指针在fputc过后已经移动到了输入后的位置
  • fseek()
    • int fseek(FILE *stream, long offset, int whence)
    • 指定stream流,偏移量offset,相对位置指的是从当前字节向前走/向后走多少个字节,whence有几个选项分别是SEEK_SET文件首,SEEK_CUR文件当前位置,SEEK_END文件尾,返回值仅表示当前是否成功
      fseek(fp, 0, SEEK_SET);//文件指针指向当前文件
      fseek(fp, -10,SEEK_CUR);//文件指针移动到当前位置的前10个字节处
    
    • 当然也可以完成空洞文件
    • 什么是空洞文件
      • 空洞文件中充斥着部分或者全部ASCII码为0的特殊数值
  • ftell()
    • long ftell(FILE *stream)
    • 读取文件指针当前的位置
    • 如何获取文件大小
      fseek(fp, 0, SEEK_END);
      printf("%ld", ftell(fp));
    
  • rewind()
    • void rewind(FILE *stream)
    • 不论文件指针在哪,直接将指针放在文件初始位置
  • fflush()
    • 首先分析下面这个例子
      #include<stdio.h>
      #include<stdlib.h>
    
      int main(){
        int i;
        printf("Before");
        while(1);
        printf("After");
        exit(0);
      }
    
    • 以上案例是否能够打印出before?—不可以—原因就是\n才会使得缓冲区进行刷新
    • fflush()就是可以强制刷新缓冲区
    • int fflush(FILE *stream)
      • 如果你需要所有数据都刷新则只需要fflush(NULL)即可
  • 缓冲区的作用
    • 大多数情况下是好事,合并系统调用
  • 行缓冲
    • 换行时候刷新,满了的时候刷新,强制刷新(标准输出是这样的,因为是终端设备)
  • 全缓冲
    • 满了的时候刷新,强制刷新(默认,只要不是终端设备)
  • 无缓冲
    • 如stderr,有信息立马刷新,需要立即输出的内容
  • 缓冲区的修改
    • setvbuff—不建议
  • 如何完整的获得一行呢?—getline
    • 调用格式上需要注意,要在文件最前面或者make文件中加入#define _GNU_SOURCE
    • ssize_t getline(char **lineptr, size_t *n, FILE *stream)
    • 从stream中读取完整的一行line,会将当前txt一行的首地址存放在lineptr这个一级指针中去,因此,第一个指针并非二级指针,而是一级指针的地址,方便存放后续每一行txt的字符串的首地址,n就是表示当前这一行的所占大小,因为不确定类型所以用size_t
    • 如果该函数使用成功则返回读取的字符个数,包含分隔符,但是不包含空字符。如果返回-1则表示失败
    • 经典调用格式
      FILE *fp = NULL;
      char *ptr = NULL;
      size_t n = 0;
    
      while (1)
      {
        if(getline(&ptr, &n, fp) < 0){
          break;
        }
        printf("%d\n", strlen(ptr));
        printf("%d\n", n);//每次增长的字节数
      }
    
    • 本函数其实是部分存在内存泄漏
  • 临时文件
    • 用户发过来的各类临时数据,需要通过这类数据进行分析反馈
    • 主要解决问题
      • 如何不冲突创建文件、及时需要销毁
    • 两个常见函数
      • char *tmpname(char *s)
        • 存在危险性,因为产生临时文件和创建临时文件并不是一气呵成的,中间如果被中断打断,则会产生不良后果
      • FILE *tmpfile(void)—产生匿名文件
        • 以二进制读写打开文件

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

相关文章:

  • Spring 项目 基于 Tomcat容器进行部署
  • 【测试】——Cucumber入门
  • 开放词汇检测新晋SOTA:地瓜机器人开源DOSOD实时检测算法
  • Mac中配置vscode(第一期:python开发)
  • 云安全博客阅读(三)
  • 反规范化带来的数据不一致问题的解决方案
  • CSDN-猜年龄、纸牌三角形、排他平方数
  • GEE:计算1990-2021年的指数最大值和最小值,并根据最大最小值对每一副影像归一化
  • 微信小程序项目实例——扫雷
  • Redis高级
  • 操作系统之内存
  • c++11_14学习之c++14新特性
  • 基础篇:09-Feign远程调用
  • C++线程池理解
  • 《Roller: Fast and Efficient Tensor Compilation for Deep Learning》
  • 对象的创建以及数组中常见的属性与方法
  • 训练自己的GPT2-Chinese模型
  • Android 进程间通信机制(三) 系统进程与应用进程通信
  • 【华为OD机试真题2023 JAVA】单核CPU任务调度
  • MySQL8 双主(主主)架构部署实战
  • GO语言--反射
  • 初识Linux
  • 机器学习---聚类算法
  • Keil5安装和使用小记
  • string的模拟实现
  • 第一次认真周赛总结