geral吧 关注:5贴子:215
  • 4回复贴,共1

【open close lseek read access】

只看楼主收藏回复

mark


IP属地:广东1楼2013-11-08 00:28回复
    read(由已打开的文件读取数据)
    相关函数
    readdir,write,fcntl,close,lseek,readlink,fread
    表头文件
    #include<unistd.h>
    定义函数
    ssize_t read(int fd,void * buf ,size_t count);
    函数说明
    read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
    附加说明
    如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。
    错误代码
    EINTR 此调用被信号所中断。
    EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
    EBADF 参数fd 非有效的文件描述词,或该文件已关闭。该文件已


    IP属地:广东2楼2013-11-11 23:21
    回复
      /* 以下代码是一个经典的拷贝文件的代码 */
      while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
      {
      /* 一个致命的错误发生了 */
      if((bytes_read==-1)&&(errno!=EINTR)) break;
      else if(bytes_read>0)
      {
      ptr=buffer;
      while(bytes_write=write(to_fd,ptr,bytes_read))
      {
      /* 一个致命错误发生了 */
      if((bytes_write==-1)&&(errno!=EINTR))break;
      /* 写完了所有读的字节 */
      else if(bytes_write==bytes_read) break;
      /* 只写了一部分,继续写 */
      else if(bytes_write>0)
      {
      ptr+=bytes_write;
      bytes_read-=bytes_write;
      }
      }
      /* 写的时候发生的致命错误 */
      if(bytes_write==-1)break;
      }
      }
      close(from_fd);
      close(to_fd);
      exit(0);
      }


      IP属地:广东3楼2013-11-11 23:28
      回复
        //修改于11-12,简化版copy文件
        #include <stdio.h>
        #include <stdlib.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        #define BUFFER_SIZE 1024
        int main(int argc,char *argv[]){
        int fr,fw;
        char buffer[BUFFER_SIZE];
        char *ptr;
        int br,bw;
        if(argc<3){
        puts("Please input the file name\n");
        exit(1);
        }
        if((fr=open(argv[1],O_RDONLY|O_CREAT))<0){
        perror("open read file failure\n");
        exit(1);
        }else{
        printf("open read file %s success\n",argv[1]);
        }
        if((fw=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))<0){
        perror("open write file failure\n");
        exit(1);
        }else{
        printf("open write file %s success\n",argv[2]);
        }
        while((br=read(fr,buffer,BUFFER_SIZE)))
        {
        ptr=buffer;
        while((bw=write(fw,ptr,br))){
        if(bw==-1){
        printf("error by interruption");
        break;
        }else if(bw==br){
        break;
        }else if(bw>0){
        ptr+=bw;
        br-=bw;
        }
        }
        if(bw==-1) break;
        if(br<BUFFER_SIZE){
        break;
        }
        close(fr);
        close(fw);
        exit(0);
        return 0;
        }
        }


        IP属地:广东4楼2013-11-12 00:26
        回复
          续楼上,read的返回值如下:
          如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。
          read之后确认下自己是不是读到底了,不是读到底了就返回0,对比读取数和buf的size,如果不相等就表示读取完了,否则应该还有。
          写入write的时候,注意要多次写入,也可以一次写入,这里我觉得没什么关系。
          不过多次写入记得移动指针。


          IP属地:广东5楼2013-11-18 20:46
          回复