zoukankan      html  css  js  c++  java
  • 文件读写和文件指针的移动

    read 函数

      -#include <unistd.h>
    
      -ssize_t read(int fd, void *buf, size_t count);
    

    从fd 所指的文件中读取count 个字节到buf 中。返回实际读取到的字节数,有错误发生则返回-1。读取文件时,文件读写指针会会随着读取到的字节数移动。

    write 函数

     - #include <unistd.h>
    
     - ssize_t write(int fd, const void *buf, size_t count);
    

    把buf中的count个字节写入fd 所指的文件中, 返回实际写入的字节数,有错误发生则返回-1。写入文件时,文件读写指针会随着写入的字节数移动。

    lseek 函数:控制文件指针的位置

    -#include <sys/types.h>
     -#include <unistd.h>
    
     -off_t lseek(int fd, off_t offset, int whence);
    

    offset 根据whence 来移动文件指针的位移数

    whence 取值 :

    取值 含义
    SEEK_SET 从文件开始处向后移动 offset
    SEEK_CUR 从文件指针当前位置处向后移动 offset,负数时向前移动offset
    SEEK_END 从文件结尾处向后移动 offset,负数时向前移动offset

    成功返回当前的读写位置,也就是距离文件开始处多少个字节,错误返回-1

    常用操作:

    用法 含义
    lseek( int fd , 0,SEEK_SET) 移动到文件开头
    lseek(int fd, 0, SEEK_END) 移动到文件结尾i
    lseek(int fd, 0, SEEK_CUR) 获取当前位置(相对于文件开头的偏移量)

    实例:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<errno.h>
    void my_err(const char *err_string ,int line )
    {
        fprintf(stderr,"line:%d " ,line) ; //fprintf()函数根据指定的格式(format)向输出流(stream)写入数据,把后面的写到前面
        perror(err_string) ;//先输出err_string ,再输出错误原因
        exit(1) ;
    }
    int  my_read(int fd) //读数据函数
    {
        int len ;
        int ret ;
        int i ;
        char read_buf[64] ;
        if((lseek( fd , 0 ,SEEK_END))== -1) //移动文件指针到结尾
            my_err("lseek",__LINE__) ; //__LINE__  预编译器内置宏,表示行数
        if((len=lseek(fd,0,SEEK_CUR)) ==  -1 ) //求相对于文件开头的偏移量,用于表明文件开始处到文件当前位置的字节数 len
            my_err("lseek",__LINE__) ; 
        if((lseek(fd,0,SEEK_SET)) ==  -1 ) //移动文件指针到开头 
            my_err("lseek",__LINE__) ; 
        printf(" 字节数是 : %d 
    ",len) ;
        if((ret = read(fd,read_buf,len)) < 0) //成功时返回实际读到的字节数,失败返回 -1
            my_err("read",__LINE__ ) ;
        for(i= 0 ;i< len ;i++)
            printf("%c",read_buf[i]) ;
        printf("
    ") ;
        return  ret ;
    }
    int main(void)
    {
        int fd ;
        char write_buf[32]="Hello Word !!" ;
        if((fd =open("example_63.c",O_RDWR | O_CREAT |O_TRUNC ,S_IRWXU))== -1) //O_RDWR 可读写 O_CREAT 创建 O_TRUNC 文件清空
            my_err("open",__LINE__) ;
        else{
            printf("Creat file success !!
    ") ;
        }
        if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //写入文件,write 的返回值是实际写入的字节数
            my_err("write",__LINE__) ;
        my_read(fd) ;    //读出数据
        printf("/*--------------------------------------------*/
    ") ;
        if(lseek(fd,10,SEEK_END)== -1) //从文件结尾处向后移动10位
        my_err("lseek",__LINE__) ; //_LINE_  预编译器内置宏,表示行数
        if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //写入文件,write 的返回值是实际写入的字节数
            my_err("write",__LINE__) ;
        my_read(fd) ;
        close(fd) ; //关闭文件
        return  0;
    }

    这里写图片描述

    这里写图片描述

    lseek 允许文件指针移到EOF之后,会以 填充,但不会改变文件大小。

    预编译器内置宏有:

       __LINE__    行数
       __TIME__    时间
       __FUNCTION__   函数
       __FINE__     文件名
    

    下一篇介绍关于文件锁的那些事.

  • 相关阅读:
    侧方停车 成功50% 一把进不去 出去二把进
    在Windows上使用 Python 安装+ win10启用长路径
    无锡 苏州 上海 古镇 汇总20200129
    win10家庭版升级 到win10企业版
    WPS Office 2019 v11.8.2.8053地方企业版 2016 v10.8.2.6948
    WPS2019党政机关单位版(无广告困扰)
    自用Chrome插件推荐【附教程及下载】
    转载 https://www.cnblogs.com/bobo-pcb/p/11708459.html
    HDU1302_Snail【模拟题】【水题】
    how to add Javascript and CSS in page layout with sharepoint 2013
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335344.html
Copyright © 2011-2022 走看看