• Linux系统编程@文件操作(一)


    只总结了部分常用的内容,详细内容参考《UNIX环境高级编程》及相关书籍。

    Linux中文件编程可以使用两种方法

    • Linux系统调用(依赖于系统)
    • C语言库函数(不依赖于系统)

    Linux系统调用实现文件编程(man 2)

    函数详见 man 2 funcname 

    文件的创建

    int creat(const char *filename, mode_t mode)

    filename: 要创建的文件名

    mode:创建模式 (S_IRUSR/S_IWUSR/S_IXUSR/S_IRWXU) //mode_t 无符号整形 (0755怎么解释)

        用数字表示    1              2              4              7  

     

    文件的描述

    所有打开文件都对应一个文件描述符。文件描述符是一个非负整数。打开文件时由系统来分配。文件描述符范围为0-OPEN_MAX,现在很多系统中OPEN_MAX=1023。

    int open(const char *pathname, int flags);

    int open(const char *pathname, int flags, mode_t mode); //此处mode用于以O_CREAT方式打开的文件,用于指定新建文件的权限

    pathname:包含路径的文件名

    flags:打开标志(O_RDONLY/O_WRONLY/O_RDWR/O_APPEND/O_CREAT/O_NONBLOCK)

              0      1      2   追加方式    创建文件     非阻塞方式

    文件的关闭

    int close(int fd);

    文件的内容读取(读位置为文件读写指针所指位置)

    int read(int fd, const void *buf, size_t length);

    从fd中读取length长度字节到buf指向的缓冲区,返回实际读取字节数。

    读取完后返回值为0。   //while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) 读完后bytes_read=0,false,退出循环。

    不能保证一次性读完文件的情况下可以循环调用read,直至读写完毕。

    文件的内容写入(写位置为文件读写指针所指位置)

    int write(int fd,const void *buf, size_t length);

    从buf指向的缓冲区中取length个字节写入fd文件中,返回实际写入字节数。

    文件的读写指针定位

    int lseek(int fd, offset_t offset, int whence);  例:lseek(fd,-1,SEEK_END);

    将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。

    offser可取负值

    whence值:SEEK_SET/SEEK_CUR/SEEK_END

    使用lseek计算文件长度 lseek(fd,0,SEEK_END);

    文件访问判断

    int access(const char* pathname, int mode);

    判断文件是否可以进行某种操作(读写等),成功后返回0,否则-1.

    pathname:包含路径的文件名

    mode:要判断的权限。 R_OK 文件可读; W_OK 文件可写; X_OK 文件可执行; F_OK 文件存在

    文件操作练习

    通过文件操作系统调用实现文件的拷贝。

    Linux库函数实现文件访问 (man 3)

    文件打开

    FILE *fopen(const char* filename, const char* mode )

    文件读操作

    size_t fread(void *ptr, size_t size, size_t n,FILE *stream)

    从stream指向的文件中读取n个字段,每个字段为size字节,并将读取的数据放入ptr所指的字符数组中,返回实际已读取的字节数。

    文件写

    size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)

    读字符

    int fgetc(FILE *stream)

    写字符

    int fputc(int c,FILE *stream)

    向指定文件中写一个字符,例 fputc(ch,fp); //char ch; FILE *fp;

    格式化读

    fscanf(FILE *stream, char *format[,argument...])

    从一个流中进行格式化输入

    格式化输出

    int fprintf(FILE *stream,char *format[,argument...])

    格式化输出到一个流中 例:fprintf(stream,"%s%c",s,c)

    文件读写定位

    int fseek(FILE *stream,long offset, int whence)

    whence: SEEK_SET/SEEK_CUR/SEEK_END

    路径的获取

    char *getcwd(char *buffer,size_t size)

    size是buffer的大小。

    创建目录

    int mkdir(char *dir,int mode)

    返回值:0:成功 -1:出错

    时间编程

    UTC:标准时间

    日历时间:从1970.1.1 0点到现在的秒数。

    时间获取

    time_t time(time_t *tloc)  //typedef long time_t

    获取日历时间

    时间转化

    struct tm *gmtime(const time_t *timep)

    将日历时间转化为格林威治标准时间,并保存到TM结构中

    struct tm *localtime(const time_t *timep)

    将日历时间转化为本地时间,并保存到TM结构。

    struct tm{
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;    //tm_year +1900=哪一年
        int tm_wday;
        int tm_yday;
        int tm_isdst;
    };
    
    #include <time.h>
    #include <stdio.h>
    
    int mian(){
        struct tm *local;
        time_t t;
        t=time(NULL);
        local=localtime(&t);
        printf("Local hour is: %d
    ",local->tm_hour);
        local=gmtime(&t);
        printf("UTC hour is: %d
    ",local->tm_hour);
        return 0;
    }
    

    时间显示

    char *asctime(const struct tm *tm)

    将tm格式的时间转化为字符串

    char *ctime(const struct time_t *timep)

    将日历时间转化为本地时间的字符串形式

    #include <time.h>
    #include <stdio.h>
    
    int main(){
        struct tm *ptr;
        time_t lt;
        
        lt=time(NULL);
        ptr=gmtime(&lt);
        printf(asctime(ptr));
        printf(ctime(&lt));
    
        return 0;
    }
    

    获取凌晨到现在的时间差

    int gettimeofday(stuct timeval *tv, struct timezone *tz)

    功能:获取从今日凌晨到现在的时间差,常用于计算事件耗时。时间差记录到tv指向的空间。tz时区

    struct timeval{

      int tv_sec;  //秒数

      int tv_usec; //微秒数

    };

    #include <sys/time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void function()
    {
        unsigned int i,j;
        double y;
        for(i=0;i<1000;i++)
            for(j=0;<1000;j++)
                    y++;
    main()
    {
        struct timeval tpstart ,tpend;
        float timeuse;
        
        gettimeofday(&tpstart,NULL);
        function();
        gettimeofday(&tpstart,NULL);
    
        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
        timeuse/=1000000;
        printf("Used Time: %f
    ",timeuse);
        
        exit(0);
    }
    

    延时执行

    unsigned int sleep(unsigned int seconds)  //使程序睡眠seconds秒

    void usleep(unsigned long usec)   //使程序睡眠usec微秒

  • 相关阅读:
    POJ 3669 Meteor Shower【BFS】
    用于JS日期格式化,以及简单运算的Date包装工具类
    asp+jQuery解决中文乱码
    jQuery制作信息提示弹出层插件【推荐】
    让 SyntaxHighlighter 3.x 支持 Lua 语法着色
    JQuery操作TABLE,及console.info问题。
    可加装广告的swf播放器JS代码
    Java 绘制环形的文字 (Circle Text Demo)
    Java数据库操作类演示
    Java 通过 HTTP 下载文件
  • 原文地址:https://www.cnblogs.com/kwseeker-bolgs/p/4373131.html
Copyright © 2020-2023  润新知