打开文件
打开文件需要引用API的头文件,还有对应的函数
参数说明:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags,mode_t mode);
pathname 为文件的名字,要写明路径
flags为标志参数,
mode为权限
参数有: O_RDONLY,只读打开
O_WRONLY,只写打开
O_RDWR,可读可写打开
open函数的执行会返回一个参数,返回-1代表失败,返回大于0的数代表成功,而且这个数代表具体的文件的代表值,类似于索引,如果后面修改文件的内容会使用到
打开文件示例代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd=open("./file1",O_RDONLY);
if(fd>0)
{
printf("fd=%d,opensuccess!\n",fd);
}
return 0;
}
运行结果
那假如我们没有这个文件会返回-1
创建文件
示例代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd=open("./file2",O_RDWR);
if(fd==-1)
{
printf("open failed\n");
fd = open("./file2",O_RDWR|O_CREAT,0760);
if(fd>0)
{
printf("fd=%d,create success!\n",fd);
}
}
return 0;
}
运行结果
向文件写入内容
ssize_t write(int fd, const void *buf, size_t count);
参数介绍:
fd为文件的对应值
buf 为要使用写入内容存放的缓冲区
count为写入内容的大小
write()函数执行的返回值为写入文件文字的数量
示例代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd=open("./file2",O_RDWR);
char *writeBuf="xwd yyds";
int write_n = write(fd,writeBuf,strlen(writeBuf));
return 0;
}
运行结果
读出文本内容
ssize_t read(int fd, void *buf, size_t count);
参数说明:
fd为文件的对应值
buf 为要读出的内容存放的缓冲区
count为写入内容的大小
read()函数执行的返回值为读出文件文字的数量
如果就这样读取会读取不出数据,因为光标停留在末尾,末尾没有文字
正确处理方式,关闭文件在打开
使用close()函数
close函数获取读取文本
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd=open("./file2",O_RDWR);
char *writeBuf="xwd yyds";
int write_n = write(fd,writeBuf,strlen(writeBuf));
char *ReadBuff=(char *)malloc(sizeof(char)*write_n+1);
close(fd);
fd=open("./file2",O_RDWR);
int read_n=read(fd,ReadBuff,write_n);
printf("read len =%d ,info:%s\n",read_n,ReadBuff);
return 0;
}
但是这种办法很不方便,每次都要打开关闭
我们可以使用API提供的函数lseek();
off_t lseek(int fd, off_t offset, int whence);
参数介绍:
fd为文件的对应值
offset为偏移量
whence可以选择:SEEK_SET(光标回到行首),SEEK_CUR(光标在当前下标),SEEK_END(光标到行末)
示例代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd=open("./file2",O_RDWR);
char *writeBuf="xwd yyds";
int write_n = write(fd,writeBuf,strlen(writeBuf));
char *ReadBuff=(char *)malloc(sizeof(char)*write_n+1);
lseek(fd,0,SEEK_SET);
int read_n=read(fd,ReadBuff,write_n);
printf("read len =%d ,info:%s\n",read_n,ReadBuff);
return 0;
}
当然seek的函数用法还很多,你可以回到行末设置偏移量同样能读出内容
Append追加内容
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd=open("./file1",O_RDWR|O_APPEND);
char *writeBuf="xwd yyds!!!";
int write_n = write(fd,writeBuf,strlen(writeBuf));
return 0;
}
运行效果
原文件
运行后
Trunc清空文本然后写入内容
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd=open("./file1",O_RDWR|O_TRUNC);
char *writeBuf="TRUNC info ";
int write_n = write(fd,writeBuf,strlen(writeBuf));
return 0;
}
效果图
create创建文件
creat()函数原型
int creat(const char * pathname, mode_t mode)
1.参数pathname指向要建立的文件路径字符串
Creat()相当于使用下列的调用方式调用open()
open(const char* pathname ,(O_CREAT|O_WRONLY|O_TRUNC));
2.参数mode为创建模式。常见的创建模式:
S_IRUSR ——可读
S_IWUSR ——可写
S_IXUSR —— 可执行
S_IRWXU ——可读、可写、可执行
示例代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd=creat("./filecreat",S_IRWXU);
return 0;
}
运行效果