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);偏移量
如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
whence SEEK_SET 基准位置为文件开头,即offset表示距离文件开头的偏移量 SEEK_END 基准位置为文件末尾,即offset表示距离文件末尾的偏移量 SEEK_CUR 基准位置为文件当前位置,即offset表示距离文件当前位置的偏移量 返回值:返回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