昨天,正式向Linux系统编程进军了,首先学习的便是文件编程。总的来说,文件编程有六个API,即创建,打开,读,写,关闭,定位。下面,将一一做介绍。
先来说说创建吧:
int creat(const char *filename,mode_t mode);
这里的creat即为系统所创建的函数,我们只需要调用它便可以 ,这个函数,便可称为API。它返回的是文件描述符fd,在后续某些API中,这个文件描述符fd可以当作文件名使用(个人理解)。
举个例子吧,
fd = creat("temp.txt",0644);
这里的temp.txt就是我们要创建的文件名称,0644代表八进制的权限信息,R4,W2,X1,八进制的读写执行。
打开:
Ⅰ、 int open(const char *filename,int flags);
还有一种是
Ⅱ、int open(const char *filename,int flags,mode_t mode);
第一种通常是打开一个已经存在的文件,如open("temp.txt",06);
这个代表以读写方式打开temp.txt的文件。
第二种有点类似vim命令,即若存在便打开,不存在就以文件名创建一个新的文件,如open("temp.txt",O_CREAT|O_RDWR,0644);
其中O_CREAT代表创建的意思,该行即表示若不存在,则创建一个名为temp.txt的文件,0644代表三方的权限,O_RDWR表示创建完毕后以读写方式打开 。
他们的返回值也都是文件描述符fd。
读写:
int read(int fd,const void *buf,size_t length); int write(int fd,const void *buf,size_t length);
其中fd即为上文中提到的文件描述符,buf是一个缓冲区,可以理解为,把文件中的length个字节内容读取存储在buf中,或者把缓冲区buf中的内容写道文件中。
下面举个例子:
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
int fd;
char w_buf[7] = "666666";
char r_buf[7];
int i;
if( (fd = open("sixsixsix.txt",O_CREAT|O_RDWR,0644)) == -1)
{
perror("open error\n");
exit -1;
}
for(i = 0;i < 6; i++)
{
if( write(fd,w_buf,6) < 0)
{
perror("write error\n");
exit -1;
}
else
{
write(fd,"\n",1);
}
}
return 0;
}
这个代码运行的结果是创建一个名为sixsixsix.txt的文本,内容截图如下
这个例子中,诠释了fd以及open,write,read的用法。
其中perror作用为,系统调用出现错误时候,打印括号中字符串提示信息,还会给出errno.h中的错误提示宏中的字符串。
关闭:
int colse(int fd);
值得注意的是,关闭函数只是清楚了fd所占用的信息空间,而所创建的文件依旧存在,若关闭失败返回-1。
还有最后一个定位函数:
格式int lseek(int fd,offset_t offset,int whence);
其中offset可以理解为偏移量,whence为相对文件位置,可以有三个取值,SEEK_SET,SEEK_CUR,SEEK_END,分别是文件头,当前位置,文件尾。
举个例子,当写入一段文档后,写入如下代码lseek(fd,100,SEEK_CUR);
,则会空出100个字符的空白区,接着在填入其他内容。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd;
char buf1[10] = "China";
char buf2[15] = "HIKVision";
fd = open("HIK.txt",O_CREAT|O_RDWR,0644);
write(fd,buf1,5);
lseek(fd,128,SEEK_CUR);
write(fd,buf2,9);
}