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

day25- 系统编程之 标准IO(II) 及 文件IO

一、补充

  • 高亮:/q
  • 想看高亮的下一个在哪,按n
  • 字符统计:wc           统计行数  -l         如wc -l filename

二、读写操作函数(续)

2.1 fwrite函数(二进制文件)

size_t fwrite(const void *ptr, size_t size, size_t nmeb, FILE *stream);大小        几份,不为1当作数组 

返回值:返回形成了几份

作用:将ptr的内容写入到FILE *stream中

2.2 fread函数 (二进制文件)

size_t fread(void *ptr, size_t size, size_t nmeb, FILE *stream);

返回值:返回对象数,当返回值小于nmeb时,认为结束

作用:将FILE*stream中的内容读到ptr中

  • 清空操作: memset(&per, 0, sizeof(per));        bzero(&per, sizeof(per)); 
  • file命令的使用: file 1.txt/main.c     若显示data则为二进制文件,显示ascii text为文本文件

扩展:

 三、文件定位

3.1 fseek函数

int fseek(FILE *stream, long offset, int whence);偏移量
whenceSEEK_SET基准位置为文件开头,即offset表示距离文件开头的偏移量
SEEK_END基准位置为文件末尾,即offset表示距离文件末尾的偏移量
SEEK_CUR基准位置为文件当前位置,即offset表示距离文件当前位置的偏移量
        如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

        返回值:返回0,偏移成功;否则,返-1;

        负数表示负向偏移

3.2 ftell函数

long ftell(FILE *stream);

        相对于文件开头的偏移字节数

        返回值为当前偏移量,单位为字节

3.3 rewind函数

void rewind(FILE *stream);

        将指针位置放于开头;

四、标准输入输出

五、缓冲区介绍

        为了匹配计算机与设备之间的速度,让低速的输入输出设备和高速的用户程序能够协调工作

行缓冲,1k, terminal(终端),主要用于人机交互stdout
    缓存区满或者遇到\n刷新    1024
                行缓存多是关于终端的一些操作
                1.遇到\n刷新
                2.缓存区满刷新
                3.程序结束刷新
                4.fflush刷新  fflush(stdout);  FILE*fp     stdin stdout stderr //主要刷输出方向

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

fflush(stdout);

无缓冲,0k  主要用于出错处理信息的输出 stderr 
            不对数据缓存直接刷新 

六、文件IO(更适合操作设备类文件)

        标准IO属于C库当中,数学库等都属于C库,可跨平台,实现多平台操作;man 3

        系统调用(system call)的函数只能在linux中去使用,不具备跨平台,称为文件IO;man 2

        二者之间,C库封装了系统调用,但系统调用只能在linux中使用:

一般都是对设备文件操作,当然也可以对普通文件进行操作

一个基于Linux内核的没有缓存的IO机制

特性:
        1. 没有缓存区
        2. 操作对象不在是流,而是文件描述符(一个整型数字,这个数字代表某种资源,可能是文件,也可能是一种设备)
        3.文件描述符 默认从0开始到1023

每个程序在启动的时候操作系统默认为其打开

三个描述符与流对象匹配:

          0 ==>STDIN_FILENO === stdin
          1 ==>STDOUT_FILENO == stdout
          2 ==>STDERR_FILENO == stderr
          stdin,stdout,stderr,===>FILE*

        unistd.h        系统调用所需包含的头文件 

系统调用的函数接口:

open
read /write 
close 

6.1 open函数

int open (const char *pathname, int flags);
int open (const char *pathname, int flags, mode_t mode);
返回值:成功返回文件描述符;反之,-1表示出错

flags:

O_RDONLY仅读

O_WRONLY

仅写
O_RDWD读写
O_APPEND追加,在文件最后挨着写
O_CREAT创建
O_TRUNC清空

        若要写多个flags:则O_WRONLY|O_CREAT|O_TRUNC

 mode(权限):

        引入:

-rw-rw-r--        一共十个,分成1和9来看

 r--          -w-         --x

100        010        001

4              2            1

用八进制表示为0421

        一般文件权限给0666

        当有O_CREATE时,给权限0666;若不给则会随机在栈上抓取一个变量用于权限

        umask:掩码默认为002,与0666相减即可得0664

6.2 write函数 

ssize_t write(int fd, const void *buf, size_t count);写入的内容        数据有效长度

返回值为long int 型,返回一个数字表示写入字节数,若为0,表示没有写入

6.3 close函数

int close(int fd);

 6.4 read函数

ssize_t write(int fd, const void *buf, size_t count);读的内容        最多读多大

返回值:成功的话,返回读到的字节数;0表示文件到结尾已经读完;

                -1则出错

  • 文本文件fgets、fputs
  • 二进制文件read、write

相关文章:

  • MCP-1:MCP组件与工作流程
  • 【leetcode】75.颜色分类
  • 一命通关单调栈
  • Vue.js教学第九章:Vue动态与异步组件,高效开发全攻略
  • Speexx: Online Language Training Business Coaching Platform
  • 在 Windows 系统部署对冲基金分析工具 ai-hedge-fund 的笔记
  • Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考
  • MYSQL日志与事件
  • 【OCCT+ImGUI系列】009-Geom2d-Geom2d_AxisPlacement
  • leetcode2844. 生成特殊数字的最少操作-medium
  • vue页面实现table动态拆分列功能
  • MyBatis:简化数据库操作的持久层框架
  • 什么是endpoints?
  • 江科大TIM定时器hal库实现
  • Python训练Day30
  • 用python实现汉字转拼音工具
  • shell脚本之函数详细解释及运用
  • 车载诊断架构 --- LIN 节点 ECU 故障设计原则
  • git工具使用
  • 第22天-Python ttkbootstrap 界面美化指南
  • 台州网站建设哪家便宜/平面设计正规培训机构
  • 网站服务器环境搭建/搜索关键词排名工具
  • 纯html网站/网站子域名查询
  • 怎么做网站变更/百度灰色词排名代发
  • 免费word文档模板下载网站/镇江关键字优化品牌
  • 袜子的网站建设方案/seo教程