文件
一.文件的打开:
open函数:
头文件:
#include<fcntl.h>
#include<sys/types.h>
#incldue<sys/stat.h>
功能:
打开和创建文件(建立一个文件描述符,其他的函数可以通过文
件描述符对指定文件进行读取与写入的操作。)
open(const char *path,int _oflag,mode_t mode);
//成功返回文件描述符,失败返回-1.
参数说明:
1.path:
要打开或创建的目标文件
2._oflag:
打开文件时,可以传入多个参数选项,用下面的
一个或者多个常量进行“或”运算,构成falgs
参数 | 功能 |
---|---|
O_WRONLY | 只写打开 |
O_RDONLY | 只读打开 |
O_RDWR | 读,写打开 |
注 | 以上三个常量有且只能有一个 |
O_CREAT | 若文件不存在,则创建它,需要使用mode选项。来指明新文件的访问权限 |
O_EXCL | 如果与O_CREAT同时设置,此指令会去检查文件是否存在,文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且将要打开的文件为符号连接,则将导致打开文件失败 |
O_APPEND | 追加写,如果文件已经有内容,这次打开文件所 写的数据附加到文件的末尾而不覆盖原来的内容 |
O_TRUNC | 若文件存在并且以可写的方式打开时,此标志会将文件长度清为0,而原来存于该文件的资料也会消失 |
3.mode_t mode:
参数 | 功能 | umask加权数值 |
---|---|---|
S_IRUSR | 所有者拥有读权限 | 4 |
S_IWUSR | 所有者拥有写权限 | 2 |
S_IXUSR | 所有者拥有执行权限 | 1 |
S_IRGRP | 群组拥有读权限 | 4 |
S_IWGRP | 群组拥有写权限 | 2 |
S_IXGRP | 群组拥有执行权限 | 1 |
S_IROTH | 其他用户拥有读权限 | 4 |
S_IWOTH | 其他用户拥有写权限 | 2 |
S_IXOTH | 其他用户拥有执行权限 | 1 |
fopen函数:
头文件:
#include<stdio.h>
功能:
用于打开文件, 其调用格式为:
FILE * fopen(const char* path,char * mode)
参数说明:
1.path:
要打开或创建的目标文件.
2.mode:
参数 | 功能 |
---|---|
r | 以只读方式打开文件,该文件必须存在 |
r+ | 以读/写方式打开文件,该文件必须存在 |
rb+ | 以读/写方式打开一个二进制文件,只允许读/写数据 |
rt+ | 以读/写方式打开一个文本文件,允许读和写 |
w | 打开只写文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件 |
w+ | 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留) |
a+ | 以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留) |
wb | 以只写方式打开或新建一个二进制文件,只允许写数据 |
wb+ | 以读/写方式打开或建立一个二进制文件,允许读和写 |
wt+ | 以读/写方式打开或建立一个文本文件,允许读写 |
at+ | 以读/写方式打开一个文本文件,允许读或在文本末追加数据 |
ab+ | 以读/写方式打开一个二进制文件,允许读或在文件末追加数据 |
二.文件的读写:
read函数:
头文件:
#include<unistd.h>
功能:
函数从打开的设备或文件中读取数据
ssize_t num = read(int fd,void *buf,size_t nbytes);
//返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
参数说明:
fd: int类型,要读取的文件的文件描述符
buf: const void*类型,存放读取的字符;
nbytes: 是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读写位置是1。注意返回值类型是ssize_t,表示有符号的size_t,这样既可以返回正的字节数0(表示到达文件末尾)也可以返回负值-1(表示出错).read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。有些情况下,实际读到的字节num(返回值)会小于请求读的字节数nbytes,例如:读常规文件时,在读到nbytes个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0
num: 返回的读取的字节总数;
write函数
头文件:
#include<unistd.h>
功能:
将某个文件缓冲区的数据,写入某个文件内
ssize_t num = write(int fd,void *buf,size_t nbytes);
//成功返回写入的字节数(小于nbytes,说明磁盘空间满了);如果没有写入任何内容,返回 0,出错返回-1,并写入errno
参数说明:
fd: int类型,要读取的文件的文件描述符;
buf: const void*类型,要写入的字符;
nbytes: 将要写入的字节总数;
num: 返回的写入的字节总数;
fread函数
头文件:
头文件:#include<stdio.h>
功能:
是用于读取二进制数据
size_t num = fread(void *buf,size_t size,size_t n,FILE*fd);
//成功:是实际读取的元素(并非字节)数目 失败:返回0 (注:如果输入过程中遇到了文件尾或者输出过程中出现了错误,这个数字可能比请求的元素数目要小)
参数说明:
buf: 是读取的数据存放的内存的指针.(可以是数组,也可以是新开辟的空间)(注: 是一个指向用于保存数据的内存位置的指针(为指向缓冲区保存或读取的数据或者是用于接收数据的内存地址) )
size: 是每次读取的字节数
n: 是读取的次数
fd: 是要读取的文件的指针 (注: 是数据读取的流(输入流) )
num: 返回的读取的字节总数;
fwrite函数
头文件:
头文件:#include<stdio.h>
功能:
是用于写入二进制数据
size_t num = fwrite(void *buf,size_t size,size_t n,FILE*fd);
//是实际写入的元素(并非字节)数目 (如果输入过程中遇到了文件尾或者输出过程中出现了失误,这个数字可能比请求的元素数目要小)
参数说明:
buf: 是一个指向用于保存数据的内存位置的指针 (是一个指针,对于fwrite来说,是要获取数据的地址)
size: 是每次写入的字节数
n: 是写入的次数
fd: 是要写入的文件的指针 (注: 是数据读取的流(输入流) )
num: 返回的写入的字节总数;
注意千万不要随意交换size和n这两个参数,否则会造成返回值错乱
三.对文件的操作:
stat函数:
头文件:
#include <sys/stat.h>
#include <unistd.h>
功能:
通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
int stat(const char *path,struct stat *buff);
// 执行成功则返回0,失败返回-1,错误代码存于errno
参数说明:
path: 是输入的文件路径
struct stat buff: 是结构体,定义如下
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
fseek函数:
头文件:
#include<stdio.h>
功能:
重定位流上的文件指针 (函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字 节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置)
int fseek( FILE *fd, long offset, int origin );
//返回值: 成功,返回0,否则返回其他值
参数说明:
fd: stream为文件指针
offset: 为偏移量,整数表示正向偏移,负数表示负向偏移
origin: 设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
参数 | 功能 | 宏定义的整数 |
---|---|---|
SEEK_SET | 指针每次指向文件开头 | 0 |
SEEK_CUR | 指针每次指向文件的相对上一次的位置 | 1 |
SEEK_END | 指针每次指向文件结尾 | 2 |
例如:
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。
lseek函数:
头文件:
#include <sys/types.h>
#include <unistd.h>
功能:
1.打开文件下一次读写的开始位置;2.拓展文件;3.获取文件大小
off_t lseek(int fd, off_t offset, int whence);
//成功返回文件读写指针距文件开头的字节大小,出错,返回-1
参数说明:
**fd:**要操作的文件描述符
offset: offset是相对于whence(基准)的偏移量
whence: 可以是SEEK_SET(文件指针开始),SEEK_CUR(文件指针当前位置) ,SEEK_END为文件指针尾
参数 | 功能 | 宏定义的整数 |
---|---|---|
SEEK_SET | 指针每次指向文件开头 | 0 |
SEEK_CUR | 指针每次指向文件的相对上一次的位置 | 1 |
SEEK_END | 指针每次指向文件结尾 | 2 |
errno错误提示信息:
可以将错误信息用strerror打印出来
printf("%s",strerror(errno));
errno0 : Success //成功
errno1 : Operation not permitted //
errno2 : No such file or directory
errno3 : No such process
errno4 : Interrupted system call
errno5 : Input/output error
errno6 : No such device or address
errno7 : Argument list too long
errno8 : Exec format error
errno9 : Bad file descriptor
errno10 : No child processes
errno11 : Resource temporarily unavailable
errno12 : Cannot allocate memory
errno13 : Permission denied
errno14 : Bad address
errno15 : Block device required
errno16 : Device or resource busy
errno17 : File exists
errno18 : Invalid cross-device link
errno19 : No such device
errno20 : Not a directory
errno21 : Is a directory
errno22 : Invalid argument
errno23 : Too many open files in system
errno24 : Too many open files
errno25 : Inappropriate ioctl for device
errno26 : Text file busy
errno27 : File too large
errno28 : No space left on device
errno29 : Illegal seek
errno30 : Read-only file system
errno31 : Too many links
errno32 : Broken pipe
errno33 : Numerical argument out of domain
errno34 : Numerical result out of range
errno35 : Resource deadlock avoided
errno36 : File name too long
errno37 : No locks available
errno38 : Function not implemented
errno39 : Directory not empty
errno40 : Too many levels of symbolic links
errno41 : Unknown error 41
errno42 : No message of desired type
errno43 : Identifier removed
errno44 : Channel number out of range
errno45 : Level 2 not synchronized
errno46 : Level 3 halted
errno47 : Level 3 reset
errno48 : Link number out of range
errno49 : Protocol driver not attached
errno50 : No CSI structure available
errno51 : Level 2 halted
errno52 : Invalid exchange
errno53 : Invalid request descriptor
errno54 : Exchange full
errno55 : No anode
errno56 : Invalid request code
errno57 : Invalid slot
errno58 : Unknown error 58
errno59 : Bad font file format
errno60 : Device not a stream
errno61 : No data available
errno62 : Timer expired
errno63 : Out of streams resources
errno64 : Machine is not on the network
errno65 : Package not installed
errno66 : Object is remote
errno67 : Link has been severed
errno68 : Advertise error
errno69 : Srmount error
errno70 : Communication error on send
errno71 : Protocol error
errno72 : Multihop attempted
errno73 : RFS specific error
errno74 : Bad message
errno75 : Value too large for defined datatype
errno76 : Name not unique on network
errno77 : File descriptor in bad state
errno78 : Remote address changed
errno79 : Can not access a needed sharedlibrary
errno80 : Accessing a corrupted sharedlibrary
errno81 : .lib section in a.out corrupted
errno82 : Attempting to link in too manyshared libraries
errno83 : Cannot exec a shared librarydirectly
errno84 : Invalid or incomplete multibyte orwide character
errno85 : Interrupted system call should berestarted
errno86 : Streams pipe error
errno87 : Too many users
errno88 : Socket operation on non-socket
errno89 : Destinationaddress required
errno90 : Message too long
errno91 : Protocol wrong type for socket
errno92 : Protocol not available
errno93 : Protocol not supported
errno94 : Socket type not supported
errno95 : Operation not supported
errno96 : Protocol family not supported
errno97 : Address family not supported byprotocol
errno98 : Address already in use
errno99 : Cannot assign requested address
errno100 : Network is down
errno101 : Network is unreachable
errno102 : Network dropped connection onreset
errno103 : Software caused connection abort
errno104 : Connection reset by peer
errno105 : No buffer space available
errno106 : Transport endpoint is alreadyconnected
errno107 : Transport endpoint is notconnected
errno108 : Cannot send after transportendpoint shutdown
errno109 : Too many references: cannot splice
errno110 : Connection timed out
errno111 : Connection refused
errno112 : Host is down
errno113 : No route to host
errno114 : Operation already in progress
errno115 : Operation now in progress
errno116 : Stale NFS file handle
errno117 : Structure needs cleaning
errno118 : Not a XENIX named type file
errno119 : No XENIX semaphores available
errno120 : Is a named type file
errno121 : Remote I/O error
errno122 : Disk quota exceeded
errno123 : No medium found
errno124 : Wrong medium type
errno125 : Operation canceled
errno126 : Required key not available
errno127 : Key has expired
errno128 : Key has been revoked
errno129 : Key was rejected by service
errno130 : Owner died
errno131 : State not recoverable
errno132 : Operation not possible due toRF-kill
errno133 : Unknown error 133
errno134 : Unknown error 134
errno135 : Unknown error 135
errno136 : Unknown error 136
errno137 : Unknown error 137
errno138 : Unknown error 138
errno139 : Unknown error 139