• Linux-文件编程


    文件编程

    两种方法:

    • Linux系统调用

    • C语言库函数

    前者依赖linux系统,后者与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法都是相同的

    系统调用-文件访问

    依赖的头文件包括但不限于

    #include <sys/types.h>
    
    #include <sys/stat.h>
    
    #include <fcntl.h>
    

    创建

    int creat(const char *filename, mode_t mode)
    

    filename:要创建的文件名(包含路径,缺省为当前路径)

    mode:创建模式

    常见的模式:

    • S_IRUSER 可读

    • S_IWUSR 可写

    • S_IWUSR 可执行

    • S_IRWXU 可读、写、执行

    还可以直接使用数字表示文件的访问权限

    • 可执行->1

    • 可写->2

    • 可读->4

    • 上述值的和,如可写可读->6

    • 无任何权限->0

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    void create_file(char *filename)
    {
    	if(creat(filename,0755) < 0)//0755:7表示文件所有者 第一个5:文件所有者所在的组 第二个5:表示其他用户
    	{
    		printf("create file %s failure!
    ", filename);
    		exit(EXIT_FAILURE);
    	}
    	else
    	{
    		printf("create file %s success!
    ", filename);
    	}
    }
    
    int main(int argc, char *argv[])
    {
    	int i;
    	if(argc < 2){
    		perror("you haven't input the filename, please try again!
    ");
    		exit(EXIT_FAILURE);
    	}
    	for(i = 1; i < argc; i++){
    		create_file(argv[i]);
    	}
    	exit(EXIT_SUCCESS);
    }
    

    文件描述

    在Linux系统中,所有打开的文件对应一个文件描述符。文件描述符的本质是一个非负整数。当打开一个文件时,该整数由系统来分配。文件描述符的范围是0~OPEN_MAX。早期的UNIX版本OPEN_MAX=19,即允许每个进程同时打开20个文件,现在很多系统则将其增加至1024

    文件打开

    int open(const char *pathname, int flags)
    int open(const char *pathname, int flags, mode_t mode)
    

    pathname:要打开的文件名(包含路径,缺省为当前路径)

    flags:打开标志

    常见的打开标志:

    • O_RDONLY 只读方式打开

    • O_WRONLY 只写方式打开

    • O_RDWR 读写方式打开

    • O_APPEND 追加方式打开

    • O_CREAT 创建一个文件

    • O_NOBLOCK 非阻塞方式打开

    如果使用的了O_CREATE标志,则使用的函数是

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

    这时需要指定mode来表示文件的访问权限

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[]){
    	int fd;
    	if(argc < 2){
    		puts("please input the open file pathname!
    ");
    		exit(1);
    	}
    
    	if((fd = open(argv[1], O_CREAT|O_RDWR, 0755))<0){
    		perror("open file failure!
    ");
    		exit(1);
    	}else{
    		printf("open file %d success!
    ", fd);
    	}
    	close(fd);
    	exit(0);
    }
    

    关闭

    int close(int fd)
    

    fd:文件描述符

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

    功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。

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

    功能:把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。

    定位

    int lseek(int fd, offset_t offset, int whence)
    

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

    whence可使用下述值:

    • SEEK_SET:相对文件开头

    • SEEK_CUR:相对文件读写指针的当前位置

    • SEEK_END:相对文件末尾

    OFFSET可取负值,表示向前移动。

    利用lseek计算文件长度:lseek(fd, 0, SEEK_END)

    访问判断

    int access(const char *pathname, int mode)
    

    pathname:文件名称

    mode:要判断的访问权限。可以取以下值或者他们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK文件存在

    返回值:当我们测试成功时,函数返回0,否则如果一个条件不符时,返回-1

    库函数-文件访问

    C库函数的文件操作是独立于具体的操作系统平台的,不管是DOS、Windows、Linux还是在VxWorks中都是这些函数。

    创建和打开

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

    filename:打开的文件名(包含路径,缺省为当前路径)

    mode:打开模式

    返回值:指向文件的指针

    常见打开方式:

    • r, rb 只读方式打开

    • w, wb 只写方式打开,如果文件不存在,则创建该文件

    • a, ab 追加方式打开,如果文件不存在,则创建该文件

    • r+, r+b, rb+ 读写方式打开

    • w+, w+b, wh+ 读写方式打开,如果文件不存在,则创建该文件

    • a+, a+b, ab+ 读和追加方式打开。如果文件不存在,则创建该文件

    b用于区分二进制文件和文本文件,这一点在DOS、Windows系统中是有区分的,但Linux不区分二进制文件和文本文件。

    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)
    

    功能:从缓冲区ptr所指的数组中把n个字段写到stream指向的文件中,每个字段长为size个字节,返回实际写入的字段数。

    读字符

    int fgetc(FILE *stream)
    

    从指定的文件中读一个字符

    写字符

    int fputc(int c, FILE *stream)
    

    向指定的文件中写入一个字符

    格式化读

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

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

    格式化写

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

    格式化输出到一个流中

    #include <stdio.h>
    FILE *stream;
    
    void main(void)
    {
    	int i = 10;
    	double fp = 1.5;
    	char s[] = "this is a string";
    	char c = '
    ';
    
    	stream = fopen("fprintf.out", "w");
    	fprintf(stream, "%s%c", s, c);
    	fprintf(stream, "%d
    ", i);
    	fprintf(stream, "%f
    ", fp);
    	fclose(stream);
    }
    

    定位

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

    whence:

    SEEK_SET 从文件的开始处开始搜索

    SEEK_CUR 从当前位置开始搜索

    SEEK_END 从文件的结束处开始搜索

    路径获取

    在编写程序的时候需要得到当前路径。

    char *getcwd(char *buffer, size_t size)
    

    我们提供一个size大小的buffer,getcwd会把当前的路径名copy到buffer中。如果buffer太小,函数会返回-1.

    #include <stdio.h>
    #include <unistd.h>
    
    int main(void)
    {
    	char buf[80];
    	getcwd(buf, sizeof(buf));
    	printf("surrent working directory: %s
    ", buf);
    }
    

    创建目录

    #include <sys/stat.h>
    int mkdir(char *dir, int mode)
    

    功能:创建一个新目录

    返回值:0表示成功, -1表述出错

    时间编程

    时间类型

    UTC(Coordinated Universal Time):世界标准时间,即格林威治标准时间

    Calendar Time:日历时间,是用“从一个标准时间点到此时经过的秒数”来表示的时间。

    时间获取

    #include <time.h>
    time_t time(time_t *tloc)
    /*typedef long time_t*/
    

    功能:获取日历时间,即从1970年1月1日0点到现在所经历的秒数。

    时间转化

    struct tm *gmtime(const time_t *timep)
    

    功能:将日历时间转化为格林威治标准时间,并保存至TM结构

    struct tm *localtime(const time_t *timep)
    

    功能:将日历时间转化为本地时间,并保存至TM结构

    时间保存

    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 main(void)
    {
    	struct tm *local;
    
    	time_t t;
    
    	t = time(NULL);
    
    	local = localtime(&t);
    
    	printf("Local time is: %d:%d:%d
    ", local->tm_hour, local->tm_min, local->tm_sec);
    
    	local = gmtime(&t);
    	printf("UTC time is:  %d:%d:%d
    ", local->tm_hour, local->tm_min, local->tm_sec);
    	return 0;
    }
    

    时间显示

    char *asctime(const struct tm *tm)
    

    功能:将tm格式的时间转化为字符串,如:

    Sat Jul 30 08:43:03 2005

    char ctime(const time_t *timep)
    

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

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

    获取时间

    int gettimeofday(struct timeval *tv, struct timezone *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; j < 1000; j++)
    			y++;
    }
    
    int main(void)
    {
    	struct timeval tpstart, tpend;
    	float timeuse;
    
    	gettimeofday(&tpstart, NULL);
    	function();
    	gettimeofday(&tpend, 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微秒

  • 相关阅读:
    大数据架构师技能图谱
    2018年,Java程序员转型大数据开发,是不是一个好选择?
    如何将java web项目上线/部署到公网
    Flume调优
    Spark流处理调优步骤
    zookeeper的WEB客户端zkui使用
    HBase各版本对Hadoop版本的支持情况
    java 代码实现使用Druid 链接池获取数据库链接
    安装postgreSQL出现configure: error: zlib library not found解决方法
    修改postgres密码
  • 原文地址:https://www.cnblogs.com/luoxiao23/p/11466051.html
Copyright © 2020-2023  润新知