int open(const char *pathname, int flags); //如果只是单纯的打开一个已经存在的文件,可以使用这个
int open(const char *pathname, int flags, mode_t mode)//mode一般是你要创建文件的时候需要填写,一般是0664表示用户和组用户均有可读写权限,其他用户只有可读权限
int creat(const char *pathname, mode_t mode); //这个相当于open(pathname,O_CREAT|O_RDWR|O_TRUNC),一般不用create这个函数open返回的是文件描述符,一般的一个程序启动的时候,默认的会自动打开标准输入输出以及错误输出。
文件描述符为STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO.为1,2,3.在程序中打开一个文件时,系统会优先选取最小的可用文件描述符,此时一般为4.
off_t lseek(int fd, off_t offset, int fromwhere);
fromwhere:
SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现这里需要注意的是,lseek不建议offset使用负数作为参数,因为这样lseek的时候有可能返回-1,此时分辨不出是error还是正常返回
ssize_t read(int fd, void *buf, size_t count); //如果 count 为零,read()返回0,不执行其他任何操作. 如果 count 大于SSIZE_MAX,那么结果将不可预料.
ssize_t write(int fd, const void *buf, size_t count); //向fd写数据,buf为数据,count指定数组长度
int close(int fd); //关闭文件描述符,这里建议open之后赶紧在后面加一个close,免得写到后面不记得。
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#define PATHNAME "/cygdrive/e/ccode/count"
#define NUM 64
int main()
{
int fd;
char buf[NUM];
int ret;
int num;
fd = open(PATHNAME,O_RDWR);
if(fd == -1){//如果没有该文件,则创建一个
fd = open(PATHNAME,O_RDWR|O_CREAT|O_TRUNC,0644);
if(fd == -1){
perror("open()");
exit(1);
}
}
ret = read(fd,buf,NUM);
if(ret == -1){
perror("read()");
exit(1);
}else if (ret == 0){//如果ret为0,则表示文件是新的
num = 0;
}else{
num = atoi(buf);
}
num ++;
lseek(fd,0,SEEK_SET);
snprintf(buf,NUM-1,"%d",num);
write(fd,buf,strlen(buf));
close(fd);
return 0;
}