文件编程概述
以下是操作系统提供的一系列API:
打开 open
读写 write/read
光标定位 lseek
关闭 close
打开创建文件(open)
函数原型以及需要包含的头文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //需要包含的头文件 int open(const char *pathname, int flags);//pathname:指代路径,const:常量,const char * :字符串常量指针;flags:是文件创建标志 int open(const char *pathname, int flags, mode_t mode);//mode:是权限, int creat(const char *pathname, mode_t mode); flags: 必须有一个的权限: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开 下列常数是可选择的: O_CREAT //文件不存在则创建它 O_EXCL //如果同时指定了O_CREAT,而文件已经存在,则打开文件失败,(用于判断文件是否存在) O_APPEND //每次写时都将内容从文件尾端换行后开始写起 O_TRUNC //直接将之前的内容全部清除,新写入执行的内容
调用open后,open会返回一个int类型的文件描述符
每个进程打开一个文件都会建立一个结构体来管理这个文件,而文件的描述符会指向内核里的结构体,起到索引的作用
open实现
int fd; fd=open("./file1",O_RDWR); printf("fd = %d\n",fd);//打印返回的文件描述符,如果存在file1,返回值大于0,如果不存在。或者打开文件失败返回一个负数 if(fd < 0){ fd=open("./file1",O_RDWR | O_CREAT,0600);//如果打开失败,再次打开并创建我文件file1,0600是可读可写权限 }
文件权限描述:
ls -l 命令后再最前面会出现 -rwxrwxr-x 的一串字符,这串字符就是文件权限
-rwxrwxr-x :最前面有一个横杠,表示是普通文件,前两个字母 rw 表示可读可写的权限,第三个字母 x 是执行权限
可读 r 4
可写 w 2
执行 x 1
mode = 0600 表示可读可写的权限( 6 = 4 + 2 )
第三位 0 :表示同组
第四位 0:表示其他组
写入文件(write)
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);//fd:文件描述符 buf:文件缓存区 count:文件长度,字节 //成功返回写入字节数,错误返回-1,用error可打出错误信息
实现代码:
char *buf="gan guo dong shuai";//先定义文件缓冲区buf write(fd,buf,strlen(buf));//写入相对于字节的数据进行fd所指的文件 close(fd);//最后记得关闭文件,不然容易将文件损坏
读文件(read)
函数及其原型
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);//fd:文件描述符 buf:读取内容放置区, count:读取长度
代码
close(fd); fd=open("./file1",O_RDWR);//这里重新关闭打开文件,原因是之前在写入文件时文件的光标已经移动到文件尾部,可以用sleek移动光标,也可以重新打开文件,重新打开文件光标就在文件头 readbuf=(char *)malloc(sizeof(char)*n_write+1);//这里需要位readbuf开辟空间 int n_read=read(fd,readbuf,n_write);//读取内容,read和write都是返回的int类型 printf("read: %d contect: %s\n",n_read,readbuf);//输出结果
光标移动操作(lseek)
原函数
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);//fd:文件描述符, offset:相对于whence偏移量 whence:位置 whence: SEEK_SET//指向文件头部 SEEK_CUR//指向文件当前位置 SEEK_END//指向文件尾部
现在我们可以把之前重新打开文件的操作换为光标移动
lseek(fd,-n_write,SEEK_CUR); lseek(fd,0,SEEK_SET); lseek(fd,-n_write,SEEK_END);//这三种方式都能将光标移动到文件头部
我们还可以用光标计算文件长度,lseek返回值是字节形式的offset;可以用下面方式计算文件长度
int a; a=lseek(fd,0,SEEK_END);
close就是关闭文件,这个前面有,就不再做说明。
整体实现代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
char *buf="gan guo dong shuai";
char *readbuf;
fd=open("./file1",O_RDWR);
printf("fd = %d\n",fd);
if(fd < 0){
fd=open("./file1",O_RDWR | O_CREAT,0600);
printf("fd = %d\n",fd);
}
//ssize_t write(int fd, const void *buf, size_t count);
int n_write=write(fd,buf,strlen(buf));
lseek(fd,-n_write,SEEK_CUR);
readbuf=(char *)malloc(sizeof(char)*n_write+1);
int n_read=read(fd,readbuf,n_write);
printf("read: %d contect: %s\n",n_read,readbuf);
close(fd);
return 0;
}