目录
打开文件(open)
作用:进程中打开一个文件返回一个文件描述符供后续read、write使用。
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 可读可写打开。
参数 flags 是通过 O_RDONLY, O_WRONLY 或 O_RDWR与零或多个可选模式按位或操作得到的。如,O_RDWR|O_CREAT。
mode: 如果指定了O_CREAT,即创建文件需要说明文件的权限,如0600。
可读 r--4,可写 w--2,可执行 x--1。上面代码中的“0600”中第3位是文件所有者的权限,6等于可读+可写 =4+2=6,第2位是同组用户,第1位是其他用户。
返回值:1.返回一个文件描述符,后面对文件进行读取,写入等操作需要文件描述符。
2.若文件打开失败,返回值 -1,并设置errno以指示错误。
创建文件(creat)
int creat(const char *pathname, mode_t mode);
filename:要创建的文件名(包含路径,缺省则为当前路径)
mode:权限
返回值: 文件描述符(fd)
常见创建模式:
宏表示 值
S_IRUSR 00400 文件所有者可读
S_IWUSR 00200 文件所有者可写
S_IXUSR 00100 文件所有者可执行
S_IRWXU 00700 文件所有者可读、写、执行
文件写入(write)
作用:将*buf指向的缓冲区的字节写入描述符指向的文件。
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:被写入文件的文件描述符, *buf:缓冲区,即字符串 count:写入文件的字节数。
返回值:如果成功写入,返回写入的字节数。出错时,返回值 -1,并设置errno以指示错误;
demo:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
char *buf = "helloworld";
fd = open("./file1",O_RDWR|O_CREAT,0600);/*或O_CREAT,若文件不存在,创建文件并赋予权限 */
if(fd==-1){
perror("perror:");
}else{
printf("open file\n");
printf("fd = %d\n",fd);
}
int n_write = write(fd,buf,strlen(buf));//文件写入
close(fd);//关闭文件
return 0;
}
写入操作时注意使用strlen计算写入的字节数,避免把‘\0'字符写入文件。
文件读取(read)
作用:从"fd"指向的文件读取"count"个字节的数据,写入"buf"。
ssize_t read(int fd, void *buf, size_t count);
参数:
fd:被读取文件的文件描述符 *buf:读取到程序中的字符串 count:读取的字节数。
返回值:成功时,返回读取的字节数。出错时,返回值 -1,并设置errno以指示错误。
文件光标移动(lseek)
移动文件的光标。
off_t lseek(int fd, off_t offset, int whence);
参数:
fd: 文件描述符 offset:相对whence偏移值,负数向前偏移,正数向后偏移
whence:选择光标位置 , SEEK_SET :文件头
SEEK_CUR:当前位置
SEEK_END:文件尾
返回值:成功时,返回从文件头到光标的字节数,可用于计算文件大小,lseek(fd,0,SEEK_END)。出错时,返回值 -1,并设置errno以指示错误。
int fileSize = lseek(fd,0,SEEK_END);//计算文件大小
demo:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
char *buf = "helloworld";
fd = open("./file1",O_RDWR|O_CREAT,0600);/*或O_CREAT,若文件不存在,创建文件并赋予权限 */
if(fd==-1){
perror("perror:");
}else{
printf("open file\n");
printf("fd = %d\n",fd);
}
int n_write = write(fd,buf,strlen(buf));//文件写入
int n_write = write(fd,buf,strlen(buf)); //将buf中一定的字节数写到fd,返回写入的字节数
if(n_write!=-1){
printf("write %d bytes to file\n",n_write);
}
char *bufRead;
bufRead = (char *)malloc(sizeof(char)*n_write);
lseek(fd,0,SEEK_SET);//文件写入后光标在末尾,现移到头部
int n_read = read(fd,bufRead,n_write);//将fd中一定的字节数数据读到bufRead
printf("read %d bytes, 内容为: %s\n",n_read,bufRead);
close(fd);//关闭文件
return 0;
}
access判断文件是否存在
判断文件是否具有读,写,可执行或者是否存在
int access(const char *pathname, int mode);
参数:
pathname:文件名
mode:可以选择以下宏:
F_OK 文件是否存在
R_OK 文件否具有读权限
X_OK 文件否具有可执行权限
W_OK 文件否具有写权限
返回值:
满足mode中的参数并且正确执行则返回0 ,否则返回-1。
文件操作原理
- 文件描述符
fd: 文件描述符,是程序对磁盘中某个文件操作后返回给程序空间的一个索引(非负整数),后续对该文件操作都需要索引。
Linux默认的文件描述符:0、1、2
标准输入和输出
UNIX shell 使用文件描述符0与进程的标准输入相结合,1与标准输出相结合,2与标准错误相结合。STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO、这几个宏分别代替0、1、2。
char readbuff[64] = "\0";
int n_read = read(0,readbuff,8);//从标准输入读取,即读取键盘的输入
int n_write = write(1,readbuff,n_read);//往标准输出写入,即在终端输出。
标准错误:将错误信息放到标准错误中。
- 文件描述符的作用域是只是当前进程。
文件操作步骤:打开/创建文件——>读取/写入文件——>关闭文件