常用的API:open write/read lseek close
open
Pathname:文件名 +文件路径(无路径 则默认为当前路径)
flags: O_RDONLY 只读
O_WRONLY 只写
O_RDWR 可读可写
以上三种只能指定一个。
O_CREAT 文件不存在则创建。
O_EXCL 如果同时指定了OCREAT,而文件已存在,则出错
O_APPEND 如果需要写入时不覆盖 直接在内容尾端开始写入
O_TRUNC 将文件内容清零重置 再写入
mode:使用了O_CREAT后,需要填写文件访问权限 例 0600
write read lseek
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd;
char* buf="stay foolish,stay hungry";
fd=open("./file1",O_RDWR);
if(fd==-1){ //如果返回值是-1则打开失败
printf("open file failed\n");
fd =open("./file1",O_RDWR|O_CREAT,0600); //利用O_CREAT新建一个文件
if(fd>0){ //返回值大于0 打开成功
printf("create file1 success!\n");
}
}
printf("open success :fd=%d\n",fd); //打印fd的值
int n_write=write(fd,buf,strlen(buf));
if(n_write != -1){ //判断wirte是否写入成功
printf("write %d byte to file\n",n_write); //打印写入了多少个字节
}
char *readBuf; //定义一个字符串指针 这里存放读到的内容
readBuf=(char *)malloc(sizeof(char)*n_write+1); //字符串指针未初始化的情况下需要开辟空间
lseek(fd,0,SEEK_SET); //这一步是为了让 光标重新回到首字符 因为write时 光标已经被推到了末尾
int n_read=read(fd,readBuf,n_write); //这里读取大小直接使用n_write的值
printf("read %d ,context:%s\n",n_read,readBuf);
close(fd);
return 0;
}
write
#include <unistd.h> //包含头文件
ssize_t write(int fd, const void *buf, size_t count);
//fd是文件描述符 字符串指针存放写入内容 可写成writebuf size 为写入文件大小
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//跟write差不多 这里的buf跟write的buf不是通用的 可以写成readbuf
lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
//fd都是一个意思 这里是从第几个字符开始 whence 里有三个 SEEK_SET(头) SEEK_END(末尾) SEEK_CUR(中间)
O_EXCL O_APPEND O_TRUNC
O_EXCL
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd;
fd=open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);
//EXCL 配合 CREAT使用 如果文件已经存在则报错
printf("the file cunzai\n");
close(fd);
return 0;
}
O_APPEND
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd;
char* buf="test";
fd=open("./file1",O_RDWR|O_APPEND);
// 在文末直接写入不覆盖之前的内容
printf("open success :fd=%d\n",fd);
int n_write=write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to file\n",n_write);
}
close(fd);
return 0;
}
O_TRUNC
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd;
char* buf="test";
fd=open("./file1",O_RDWR|O_TRUNC);
//将文件清零 重新写入
printf("open success :fd=%d\n",fd);
int n_write=write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to file\n",n_write);
}
close(fd);
return 0;
}
CRATE
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd;
char* buf="test";
//int creat(const char *pathname, mode_t mode);
//pathname是创建文件存放位置 mode为创建模式 常见的有 S_IRUSR 可读 S_IWUSR 可写 S_IXUSR 可执行 S_IRWXU 可读可写可执行
fd =creat("/home/CLC/wenjian/file3",S_IRWXU);
return 0;
}