(一)系统调用-文件访问

系统调用-文件访问

linux下的文件编程:

  • 系统调用的方式
  • C语言库函数方式- 系统调用方式 -

- 系统调用的方式 -


  1. int creat(const char *filename,mode_t mode)

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

    mode: 创建模式

    ​ S_IRUSR = 可读 =》4

     S_IWUSR =	可写		=》2
    

    ​ S_IXUSR = 可执行 =》1

    ​ S_IRWXU = 读写执行 =》7

    例子:

    ​ 读写权限:0110;

    ​ 可写可执行:0011;

  2. 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 => 创建方式打开(用方式2,加入mode参数)

    ​ O_NOBLOCK => 非阻塞方式打开

    例子:fd = open(argv[1],O_CREAT|O_RDWR,0755

  3. int close(int fd)

    关闭文件,在拿到系统分配的文件标识符后,当作参数传递给close函数,即可关闭对应的已打开文件。

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

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

    fd:指向你所需要阅读文件的文件标识符

    buf:缓冲区

    length:读取的字节长度

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

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

    fd:要写入的文件对象的标识符

    buf:缓冲区

    length:要写入的字节数

  6. int Iseek(int fd,offset_t offset,int whence)

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

    offset: 负数-相对于当前,向 开头偏移; 正数-相对于当前,向 结尾偏移;

  7. int access(const char *pathname, int mode)

    pathname: 文件名称

    mode:要判断的访问权限:

    ​ R_OK => 文件可读

    ​ W_OK => 文件可写

    ​ X_OK => 文件可执行

    ​ F_OK => 文件存在

    测试的时候,如果有任何一个条件不成立,就返回-1.

- C语言库函数调用方式 -


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

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

    mode:打开模式

    简称描述
    r , rb只读方式打开
    w , wb只写方式打开,如果文件不存在,则创建文件
    a , ab追加方式打开,如果文件不存在,则创建该文件
    r+ , r+b , rb+读写方式打开
    w+ , w+b , wh+读写方式打开,如果文件不存在,则创建文件
    a+ , a+b , ab+读和追加方式打开,如果文件不存在,则创建该文件
  2. size_t fread(void *ptr, size_t size,size_t n,FILE *stream)

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

    ptr: 存放读取到的字符

    size: 每个字段的字节数

    n: 要读取的字段数

    stream: 要读取得目标文件

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

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

  4. int fgetc(FILE *stream)

    用于读取指定文件stream中的一个字符。

    #inlcude <stdio.h>
    main()
    {
        FILE *fp;
        char ch;
        if((fp=fopen("file1","rt"))==NULL){
            printf("\n Cannnot open file strike any key exit!");
            getch();
        	exit(1);
        }
        ch = fgetc(fp);
        while(ch != EOF){//判断是否结束符
            putchar(ch);
            ch = fgetc(fp);
        }
        fclose(fp);
    }
    
  5. int fputc(int c , FILE *stream)

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

    #inlcude <stdio.h>
    main()
    {
        FILE *fp;
        char ch;
        if((fp=fopen("file1","wt+"))==NULL){
            printf("\n Cannnot open file strike any key exit!");
            getch();
        	exit(1);
        }
        printf("input a string:\n");
        ch = getchar();
        while(ch != '\n'){//判断是否结束符
            fputc(ch,fp);
            ch = getchar();
        }
        printf("\n");
        fclose(fp);
    }
    
  6. int fscanf(FILE *stream, char *format[,argument…])

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

    #inlcude <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
    	int i;
    	printf("Input an integer: ");
    	if(fscanf(stdin,"%d",&i))
    		printf("The integer read was: %d\n",i);
    	return 0;
    }
    
  7. int fprintf(FILE *stream, char *format[,argument…])

    格式化输出到一个流中

    #include <stdio.h>
    #include <process.h>
    FILE *stream;
    void main(void){
        int i=10;
        double fp = 1.5;
        char s[]="this is a string!";
        cahr c = "\n";
        stream = fopen("file1","w");
        fprintf(stream,"%s%c",s,c);
        fprintf(stream,"%d\n",i);
        fprintf(stream,"%f\n",fp);
        fclose(stream);
    }
    
  8. int fseek(FILE *stream, long offset, int whence)

    查询文件

    whence参数:

    ​ SEEK_SET 从文件的开始处开始探索

    ​ SEEK_CUR 从当前位置开始搜索

    ​ SEEK_END 从文件的结束处开始搜素

    offset参数

    ​ 负数: 向开头方向

    ​ 正数: 向结尾方向

  9. char *getcwd(char *buffer,size_t size)

    获取当前路径women提供一个size大小的buffer来存储路径名,如果buffer太小,函数返回 -1

    #include <unistd.h>
    main(){
        char buf[80];
        getcwd(buf,sizeof(buf));
        printf("current working directory: %s\n",buf);
    }
    
  10. int mkdir(char *dir,int mode)

    创建一个目录,0表示成功,-1表示出错。函数:#include<sys/stat.h>

    #include <sys/stat.h>
    int main(char argc, char *argv[])
    {
    	int ok = 0;
    	if((ok=mkdir(argv[1],0755)) != 0)
    	{
    		perror("mkdir %s", argv[1]);
    	}
    	return 0;	
    }
    

时间编程&必修实验

- 时间函数-

函数包含文件:#include<sys/stat.h>

  1. time_t time(time_t *tloc)

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

  2. 时间转化

    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;		//日光节约时间
    }
    

    实例程序time1.c:

    #include <time.h>
    #include <stdio.h>
    int main(void){
        struct tm *local;
        time_t t;
        t = time(NULL);
        local = localtime(&t);
        printf("Local hour is:%d\n",local->tm_hour);
        local = gmtime(&t);
        printf("UTC hour is:%d\n",local->tm_hour);
        return 0;
    }
    
  3. 时间显示

    char  *asctime(const struct tm *tm)

    功能:将tm格式的时间转化为字符串,如:Sat Jul 30 08:43:03 2005

    char *asctime(const time_t *timep)

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

    实例程序time2.c:

    #include <time.h>
    #include <stdio.h>
    int main(void){
        struct tm *ptr;
        time_t It;
        It = time(NULL);
        ptr = gmtime(&It);//转化成格林威治时间
        printf(asctime(ptr));//输出格林威治时间的字符串
        printf(ctime(&It));//输出本地时间的字符串
        return 0;
    }
    
  4. 获取时间

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

    功能:获取从今天凌晨到现在的时间差,常用于计算时间耗时。

    struct timeval{
        int tv_sec;		//秒数
        int tv_usec;	//微秒数
    }
    

    实例time3.c:

    #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;j++){
            for(j=0;j<1000;j++){
                y++;
            }
        }
        
    }
    
    main()
    {
        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\n",timeuse);
        exit(0);
    }
    
  5. 延时函数(delay)

    unsigned int sleep(unsigned int seconds)

    功能:使得程序睡眠(延时阻塞)seconds秒

    void usleep(unsigned long usec)

    功能:使得程序睡眠(延时阻塞)usec微秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值