标准库IO和系统调用IO
一、标准库IO
1.1 fopen
接口:FILE * fopen(const * path,const char * mode);
功能:打开一个文件。
返回值:打开成功返回文件流指针。打开失败返回NULL。
const char * path:打开的文件的路径加文件名(如果不加路径,默认从当前路径查找)。
const char * mode:对文件进行操作的方式。
操作方式:
r:打开文本文件,用于读文件,文件流指针被定位于文件的开始。
r+:打开文本文件,用于读写文件,文件流指针被定位于文件的开始。
w:将文件长度截断为零,或者创建文本文件,用于写。文件流指针被定位于文件的开始。
w+:打开文件,用于读写。如果文件不存在就创建它,否则将截断它。文件流指针被定位于文件的开始。
a:打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。文件流指针被定位在文件的末尾。
a+: 打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。读文件的初始位置是文件的开始,写入被追加到文件的末尾。
b:fopen打开文件默认文本操作,使用b表示进行二进制操作。
举例说明:
在这里我只举例说明了写操作以及追加读写操作,其他操作大家可以自行验证,这里一定要注意的就是二进制操作(b),要进行什么样的操作要非常细心!!
1.2 fread
在上面介绍fopen的过程中,大家也看到我也使用了fread去读一个文件,在这里我就在细细的讲一下:
接口:size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
功能:读取文件中的数据。
返回值:返回读取文件数据的实际字节数
void * ptr:读取文件数据的存储位置。
size_t size:读取的文件中每个元素的字节数。
size_t nmemb:读取的文件中元素的个数。
FILE * stream:文件流指针。
举例说明:
上面是我对fread接口简单做的演示,这里需要注意的是如果要进行fread接口的使用,对文件的操作就必须要有读的操作,不让文件不让读操作,就无法使用该接口(一个汉字占3个字节)。
1.3 fwrite
接口:size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
功能:将数据写入文件。
返回值:返回写入文件的数据的实际字节数。
const void * ptr:写入文件的数据。
size_t size:写入文件的数据每个元素的字节数。
size_t nmemb:写入文件的数据元素的个数。
FILE * stream:文件流指针。
举个例子:
1.4 fseek
int fseek(FILE * stream,long offset,int whence);
功能:为文件流指针所指向的流设置文件位置指示符。以字节为单位的新位置。
返回值:设置成功返回0,失败返回-1。
FILE * stream:文件流指针。
long offset:指定从目前位置偏移的字节数。
int whence:指定偏移的起始位置。
SEEK_SET:偏移起始位置为文件开头。
SEEK_CUR:偏移起始位置为文件流指针指向的当前位置。
SEEK_END:偏移起始位置为文件末尾。
举例:
这里需要注意的是偏移的字节数,以文件末尾为起始位置偏移,向前偏移使用的是正数,例如:从文件末尾向前偏移2个字节为fseek(stream,2,SEEK_END);
1.5 fclose
接口:int fclose(FILE * stream)
功能:关闭一个操作完成后的文件。
返回值:成功关闭返回0,否则返回EOF,并且设置全局变量errno来指示错误发生。
FILE * stream:文件流指针。
在上边的例子中,每一次操作都会取关闭文件,所以关于关闭文件的操作,在这里就不举例说明了。大家可以自行验证。
二、系统调用IO
2.1 open
接口:int open(const char * pathname,int flags);
功能:打开一个文件
返回值:成功打开返回一个文件描述符(一个非负的小整数, 在read , write 等 I/O操作中将会被使用),失败返回负数。
const char * pathname:操作文件的的路径加文件名(如果没有路径,则在当前目录下查找)
int flags:文件的操作模式。
mode_t mode:访问权限
操作模式:
必选:O_RDONLY(只读),O_WRONLY(只写 ),O_RDWR(读写)
可选:
O_CREAT:若文件不存在 将创建一个新文件。
O_EXCL:通过O_CREAT, 生成文件, 若文件已经存在 ,则报错返回。
O_TRUNC:若文件已经存在 , 且是一个普通文件 ,打开模式又是可写(即文件 是用O_RDWR或O_WRONLY模式打开的) , 就把文件的长度设置为零, 丢弃 其中的现有内容(清空数据)。
O_APPEND:文件以追加模式打开。在写以前 , 文件读写指针被置在文件的 末尾。
举个例子:
在追加O_CREAT模式后就会去创建文件:
需要注意的是,当我们使用O_CREAT模式创建一个文件时,我们就需要去使用mode_t mode去设置访问权限。
2.2 write
接口:ssize_t write(int fd,const void * buf,size_t count);
功能:将数据通过文件描述符写入指定的文件。
返回值:返回写出文件的数据的实际字节数。
int fd:文件描述符。
const void * buf:要写入的文件的数据。
size_t count:要写入文件数据的字节数。
举例说明:
从例子可以看出,对于O_WRONLY模式,在写入是总是从文件的开头写入,如果想要从文件末尾写入,可以追加O_APPEND模式。
2.3 read
接口:sszie_t read(int fd,void * buf,size_t count);
功能:读取文件中的数据。
返回值:返回实际读取的文件中的数据的字节数。
int fd:文件描述符。
const void * buf:读取文件数据的存储位置。
size_t count:要读取文件数据的字节数。
举例:
在读写操作中,需要注意的是,需要什么样的操作就要变成什么样的模式!!
2.4 sleek
接口:off_t lseek(int fd,off_t offset,int whence);
功能:与fseek功能类似。
返回值:设置成功返回从文件开头开始的偏移的字节数,设置失败返回-1。
int fd:文件描述符。
off_t offset:指定从目前位置偏移的字节数。
int whence:指定偏移的起始位置。(与fseek相同)
举例:
2.5 close
接口:int close(int fd);
功能:通过文件描述符关闭相应的文件。
返回值:文件关闭成功返回0,失败返回-1。
int fd:文件描述符。
关于文件关闭操作,比较简单,在这里就不举例说明了。