关于文件的总结

一.文件的打开:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值