系统文件IO使用
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);
返回:若成功为文件描述符,若出错为-1
功能:打开或创建一个文件
- 参数:
- pathname:要打开或者创建的文件路径
- flags:用来说明此函数的多个选择项
- O_RDONLY 只读
- O_WRONLY 只写
- O_RDWR 读写
- mode:新建文件的访问权限,对于open函数而言,仅当创建新文件时才使用第三个参数。
open函数的flags参数(一个或多个常数进行或运算构成)(常数定义在<fcntl.h>)
标识 | 含义 |
---|---|
O_RDONLY | 以只读方式打开文件 |
O_WRONLY | 以只写方式打开文件 |
O_RDWR | 以读写方式打开文件 |
O_APPEND | 以追加模式打开文件,每次写时都加到文件的尾端,但在网络文件系统进行操作时却没有保证。 |
O_CREAT | 如果指定的文件不存在,则按照mode参数指定的文件权限来创建文件 |
O_EXCL | 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在。但在网络文件系统进行操作进却没有保证。 |
O_DIRECTORY | 如果参数pathname不是一个目录,则open出错 |
O_TRUNC | 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0 |
O_NONBLOCK | 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。 |
2、creat函数
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int creat(const char* pathname,mode_t mode);
返回:若成功为只写打开的文件描述符,若出错为-1
功能:创建一个新文件
- 此函数等效于:
open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode);
- creat的一个不足之处是它以只写方式打开所创建的文件。
3、close函数
#include<unistd.h>
int close(int fd);
返回:若成功为0,若出错为-1
功能:关闭一个打开的文件
- 参数
fd:已打开文件的文件描述符 - 当一个进程终止时,它所有的打开文件都由内核自动关闭
4、read函数
#include<unistd.h>
ssize_t read(int fd,void * buf,size_t count);
返回:读取的字节数,若已到文件尾为0,若出错为-1
功能:从打开文件中读数据
- 参数
- fd:读取文件的文件描述符
- buf:存放读取数据的缓存
- count:要求读取一次数据的字节数
- 有多种情况可使实际读取的字节数少于要求读字节数
- 读取普通文件时,在读到要求字节数之前已到达了文件尾端。
- 当从终端设备读时,通常一次最多读一行
- 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
- 某些面向记录的设备,例如磁带,一次最多返回一个记录。
- 进程由于信号造成中断。
- 读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读得的字节数。
- 示例:
①申请一个字符数据:char buffer[1024]
;
②打开一个文件fdin=open(文件名,O_RDONLY)
; //以读的方式打开
③调用读read(fdin,buffer,1024)
//从文件中读取数据放入buffer中
5、write函数
#include<unistd.h>
ssize_t write(int fd,const void * buf,size_t count);
返回:若成功则返回已写的字节数,若出错为-1
功能:向打开的文件中写数据
-
参数
- fd:写入文件的文件描述符
- buf:存放待写数据的缓存
- count:要求写入一次数据的字节数
-
其返回值通常与参数count的值不同,否则表示出错
-
wtite出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。
-
对于普通文件,写操作从文件的当前位移量处开始。如果在打开该文件时,指定了O_APPEND选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次成功写之后,该文件位移量增加实际写的字节数。
-
示例:
①申请一个字符数据:char buffer[1024];
②打开一个文件fdout=open(文件名,O_WRONLY|O_CREAT|O_TRUNC,0777)
; //以写的方式打开
③调用读read(fdin,buffer,1024)
//先从文件中读取数据放入buffer中
④调用写write(fdout,buffer,1024)
//将fuffer中的数据写入文件中
6、ISEEK函数
#include<sys/types.h>
#include<unistd.h>
off_t Iseek(int fd,off_t offset,int whence);
返回:若成功则返回新的文件位移量(绝对偏移量),若出错为-1
功能:定位一个已打开的文件
- 参数
fd:
已经打开文件的描述符offset:
位移量whence:
定位的位置SEEK_SET:
将该文件的位移量设置为距文件开始处offset个字节SEEK_CUR:
将该文件的位移量设置为其当前值加offset,offset可为正或负SEEK_END:
将该文件的位移量设置为文件长度加offset,offset可为正或负(正向前进,负向后移动)
- ISEEK也可用来确定所涉及的文件是否可以设置位移量。如果文件描述符引用的是一个管道或FIFO,则ISEEK返回-1,并将errno设置为EPIPE.
- 每个打开文件都有一个与其相关联的“当前文件偏移量”。它是一个非负整数,用度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。按系统默认,当打开一个文件时,除非指定O_APPEND选择,否则该位移量被设置为0.
示例代码:
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(void)
{
int fd = open("data", O_WRONLY | O_CREAT, 0664);
if(fd < 0){
perror("");
return 1;
}
char str[1024] = "";
while(1){
int len = read(0, str, 1024);
write(fd, str, len);
}
close(fd);
return 0;
}