zoukankan      html  css  js  c++  java
  • Linux文件编程

    Linux系统调用

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

    vLinux系统调用

    vC语言库函数

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

    系统调用-创建

    intcreat(constchar*filename,mode_tmode)

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

    vmode:创建模式

    常见创建模式:

    S_IRUSR

    可读

    S_IWUSR

    可写

    S_IXUSR

    可执行

    S_IRWXU

    可读、写、执行

    除了可以使用上述宏以外,还可以直接使用数字来表示文件的访问权限:

    v可执行

    -> 1

    v可写

    -> 2

    v可读

    -> 4

    v无任何权限

     -> 0

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

    系统调用-打开

    vint open(const char *pathname, int flags)

    vint open(const char *pathname, int flags,

    mode_t mode)

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

    前路径)

    flags:打开标志

    文件描述

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

     

    常见的打开标志:

    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来表示文件的访问权限。

     

    系统调用-关闭

    当我们操作完文件以后,需要关闭文件:

    intclose(intfd)

    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可取负值,表示向前移动。例如下述调用可将文件指针相对当前位置向前移动5个字节:lseek(fd, -5,SEEK_CUR)

    系统调用-访问判断

    有时我们需要判断文件是否可以进行某种操作(,),这时可以使用access函数:

    int access(const char*pathname,intmode)

    pathname文件名称

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

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

    例:

    #include<unistd.h>

    int main()

    {

    if(access(/etc/passwd”,R_OK) = =0)

    printf(“/etc/passwd can beread!\n”);

    }

    C语言库函数

    库函数-创建和打开

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

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

    vmode:打开模式

    常见打开模式:

    vr, rb

    只读方式打开

    vw, wb

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

    va, ab

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

    vr+, r+b, rb+

    读写方式打开

    vw+, w+b, wh+ 

     读写方式打开,如果文件不存在,则创建该文

    va+, a+b, ab+

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

    b用于区分二进制文件和文本文件,这一点DOSWindows系统中是有区分的,但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)从指定的文件中读一个字符

     

    #include<stdio.h>

    main()

    {

    FILE *fp;

    char ch;

    if((fp=fopen("c1.txt","rt"))==NULL)

    {

    printf("\nCannot open filestrike any key exit!");

    getch();

    exit(1);

    }

    ch=fgetc(fp);

    while(ch!=EOF)

    {

    putchar(ch);

    ch=fgetc(fp);

    }

    fclose(fp);

    }

    库函数-格式化读

    fscanf(FILE*stream, char *format[,argument...])从一个流中进行格式化输入

     

    #include <stdlib.h>

    #include <stdio.h>

    int main(void)

    {

    int i;

    printf("Input an integer:");

    if (fscanf(stdin, "%d",&i))

    printf("The integer read was:%i\n", i);

    return 0;

    }

    库函数-格式化写

    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 astring";

    char c = '\n';

    stream = fopen("fprintf.out", "w" );

    fprintf( stream, "%s%c",s, c );

    fprintf( stream, "%d\n", i);

    fprintf( stream, "%f\n",fp );

    fclose( stream ); }

    库函数-定位

    intfseek(FILE*stream,longoffset,intwhence)

    whence :

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

    SEEK_CUR 从当前位置开始搜索

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

    路径获取

    在编写程序的时候,有时候需要得到当前路径。C库函数提供了getcwd来解决这个问题。

    char *getcwd(char *buffer,size_tsize)

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

    #include<unistd.h>

    main()

    {

    char buf[80];

    getcwd(buf,sizeof(buf));

    printf(“current working directory :%sn”,buf);

    }

    创建目录

    #include <sys/stat.h>

    int mkdir(char * dir, int mode)

    功能:创建一个新目录。

    返回值:0表示成功,-1表述出错。并将错误记录到全局变量errno中

    mode方式:可多个权限相或,如0755表示S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH |S_IXOTH代表:该文件所有者拥有读,写和执行操作的权限,该文件用户组拥有可读、可执行的权限,其他用户拥有可读、可执行的权限。

    S_IRWXU

    00700权限,代表该文件所有者拥有读,写和执行操作的权限

    S_IRUSR(S_IREAD)

    00400权限,代表该文件所有者拥有可读的权限

    S_IWUSR(S_IWRITE)

    00200权限,代表该文件所有者拥有可写的权限

    S_IXUSR(S_IEXEC)

    00100权限,代表该文件所有者拥有执行的权限

    S_IRWXG

    00070权限,代表该文件用户组拥有读,写和执行操作的权限

    S_IRGRP

    00040权限,代表该文件用户组拥有可读的权限

    S_IWGRP

    00020权限,代表该文件用户组拥有可写的权限

    S_IXGRP

    00010权限,代表该文件用户组拥有执行的权限

    S_IRWXO

    00007权限,代表其他用户拥有读,写和执行操作的权限

    S_IROTH

    00004权限,代表其他用户拥有可读的权限

    S_IWOTH

    00002权限,代表其他用户拥有可写的权限

    S_IXOTH

    00001权限,代表其他用户拥有执行的权限

     

     

     

  • 文章声明
  • 作者:Owen
  • 出处: http://www.cnblogs.com/owenyang
  • 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该博客同步发在 HEXO-博客
查看全文
  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/owenyang/p/3579129.html
  • Copyright © 2011-2022 走看看