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

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
http://www.xdnf.cn/news/7893.html

相关文章:

  • 网络编程概述
  • 搭载1000nits激光显示技术,海信电视探索X1系列发布
  • 【18. 四数之和 】
  • 【Linux系统】第七节—git+cgdb(详解)
  • MySQL 中 information_schema.processlist 使用原理
  • RT_Thread——内存管理
  • golang库源码学习——Pond,小而精的工作池库
  • git仓库代码操作
  • springboot+vue实现鲜花商城系统源码(带用户协同过滤个性化推荐算法)
  • 【WebRTC】源码更改麦克风权限
  • Redis 8.0 GA,重回开源
  • Wireshark抓包分析小程序接口请求教程
  • Nginx配置同一端口不同域名或同一IP不同端口
  • day32 python解释性库PDPbox
  • java 代码查重(三)常见的距离算法和相似度(相关系数)计算方法
  • 养生指南:五维升级健康生活
  • 23种经典设计模式(GoF设计模式)
  • 【苍穹外卖】Day01—Mac前端环境搭建
  • leetcode hot100刷题日记——7.最大子数组和
  • systick滴答定时器us延时和毫秒延时
  • 自动获取新版本 js 静态文件
  • 计算机网络-MPLS VPN报文转发
  • Redis面试题全面解析:从基础到底层实现
  • Python Seaborn 高级可视化指南
  • Datawhale 5月llm-universe 第4次笔记
  • 游戏引擎学习第302天:使用精灵边界进行排序
  • 化工行业质检LIMS 系统应用 原材料与成品质量追溯智能化方案
  • Hass-Panel - 开源智能家居控制面板
  • LeetCode222_完全二叉树的结点个数
  • vscode离线安装组件工具vsix