Linux-C 文件操作
一、简述
二、系统I/O
三、标准I/O
四、标准输入/输出重定向
五、文件操作补充
六、上述文件操作函数代码示例
一、简述
**
基于Linux环境下C语言编程的文件操作。
两种操作文件的方式:
1、系统I/O:系统调用接口,`open(), read(), write(), lseek(), close()`。是操作系统直接提供的编程接口(API)。
2、标准/IO:标准库的I/O函数,fopen(), fread(), fwrite(), fseek(), fclose(),是对系统调用接口进一步封装。
系统I/O常用于硬件级别,可以设置读缓冲区,一般没有写缓冲区;
标准I/O常用于软件级别,自带读写缓冲区。
1、文件基本概念
C程序把文件分为ASCII文件和二进制文件,ASCII文件又称文本文件,二进制文件和文本文件(也称ASCII码文件)二进制文件中,数值型数据是以二进制形式存储的,
而在文本文件中,则是将数值型数据的每一位数字作为一个字符以其ASCII码的形式存储,因此,文本文件中的每一位数字都单独占用一个字节的存储空间,
而二进制文件则是把整个数字作为一个二进制数存储的,并非数值的每一位数字都占用单独的存储空间,无论一个C语言文件的内容是什么,
它一律把数据看成是字节构成的序列,即字节流,对文件的存取也是以字节为单位的,输入/输出的的数据流仅受程序控制而不受物理符号(如回车换行符)的控制,所以说C语言文件为流式文件
C语言的文件存取有两种方式:顺序存取和直接存取
(C语言有缓冲型和非缓冲型两种文件系统,缓冲型文件系统是指系统自动自动在内存中为每一个正在使用的文件开辟一个缓冲区,
作为程序与文件之间数据交换的中间媒介,也就是读文件时,数据先送到缓冲区,再传给C语言程序或则外存上,缓冲文件系统利用文件指针标识文件,
而非缓冲文件系统是不会自动设置文件缓冲区,缓冲区必须由程序员自己设定,缓冲型中的文件操作,也称高级文件操作,
高级文件操作函数大多是ANSIC定义的可移植的文件操作函数,具有跨平台和可移植能力,可解决大多数文件操作问题)
##二、系统I/O
**2.1 open()函数**
功能 打开一个指定的文件并获得文件描述符,或者创建一个新文件
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
***参数***
pathname 要打开的文件路径名称
**flags**
O_RDONLY 只读方式打开文件 这三个参数互斥
O_WRONLY 只写方式打开文件
O_RDWR 读写方式打开文件
O_CREAT 如果文件不存在,则创建该文件
O_TRUNC 如文件已经存在,则删除文件中原有数据
O_APPEND 以追加方式打开文件
mode 如果文件被新建,指定其权限为mode(八进制表示法)
返回值 成功 大于等于0 的整数(即文件描述符)
失败 -1,并且errno会被设置
**补充说明:**
1)flags 的各种取值可以用位或的方式叠加起来,例如创建文件的时候需要满足这样的
选项:读写方式打开,不存在要新建,如果存在了则清空。则flags 的取值应该是:O_RDWR | O_CREAT | O_TRUNC。
2)mode 是八进制权限,比如0644,或者0755 等。也可以是使用系统已定义的
S_IRWXU 00700 user (file owner) has read, write, and execute permission //用户可读写执行权限
S_IRUSR 00400 user has read permission//用户写权限
S_IWUSR 00200 user has write permission//用户写权限
S_IXUSR 00100 user has execute permission//用户执行权限 (更多选项可查询man手册:man 2 open)
比如新创建的文件权限只需要读写权限:S_IRUSR | S_IWUSR
**3)文件描述符**
其实是一个数组的下标值,在内核中打开的文件是用 file 结构体来表示的,每一个结构体都会有一个 指针来指向它们,这些指针被统一存放在一个叫做 fd_array 的数组当中,而这个数组被存 放在一个叫做 files_struct 的结构体中,该结构体是进程控制块 task_struct 的重要组成部分。
**2.2 close()函数**
功能:关闭文件并释放相应资源
头文件
#include <unistd.h>
原型
int close(int fd);
**参数**
fd 要关闭的文件的描述符
返回值
成功
0
失败
-1
备注
重复关闭一个已经关闭了的文件或者尚未打开的文件是安全的。
**2.3 read()函数**
功能
从指定文件中读取数据
头文件
#include <unistd.h>
原型
ssize_t