Linux中的标准IO【下】
创始人
2025-05-30 20:57:38

标准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#includeint 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)—产生匿名文件
        • 以二进制读写打开文件

相关内容

热门资讯

重庆旅游六天五夜多少钱?费用明... 大家好,我是小李!上个月刚和朋友去重庆浪了六天五夜,简直爽翻天!重庆这地方,山城魔幻、火锅香辣,玩得...
实测讲解“网易棋牌究竟有挂吗”... 您好:网易棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游戏...
去河南旅游纯玩团6日游详细行程... 各位朋友好呀,我是你们这次河南少林寺 6 日纯玩团的导游小陈!河南是中华文明的重要发祥地,而少林寺更...
玩家攻略“生肖猴房卡多少钱怎么... 【要素一】(KK)微信链接各大厅/房卡介绍微/44858861生肖猴是一款非常火爆的游戏应用,拥有众...
黄山旅游4天3夜花多少钱?安徽... 自从孩子上了小学,我们一家三口就很少有机会一起出远门旅游了。这次,趁着孩子暑假,我们决定去黄山走一走...