open,lseek,read,write,close系统调用《unix环境高级编程读书笔记》(1)

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;

} 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值