• LINUX C系统编程学习笔记文件编程


    文件编程  

    一.系统调用~~创建

    int creat (const char *filename, mode_t mode);

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

    mode:创建模式

    常见的模式:

    S_IRUSR       可读

    S_IWUSR     可写

    S_IXUSR     可执行

    S_IRWXU     可读,写,执行 

    还可以用数字表示:

    4 代表可读 

    2 代表可写

    1 代表可执行

    7 代表可读,写,执行

    例: 

    #incldue <stdio.h> 

    #include <stdlib.h>

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    void creat_file(char *filename)
    {
        if (creat(filename,0755) < 0)
        {
            printf("Creat file %s failure!\n",filename);
            exit(EXIT_FAILURE);
        }    
        else
        {
            printf("Creat file %s success!\n",filename);
        }
    }
    void main(int argc,char *argv[])
    {
        int i;
        if (argc < 2)
        {
            perror("You haven't input the filename.please try again!\n");
            exit(EXIT_FAILURE);
        }
        for (i = 1;i < argc;i++)
        {
            creat_file(argv[i]);
        }
        exit(EXIT_SUCCESS);

    代码编译环境:

    系统:Rad Hat 5

     编译器:GCC 4.1.2 

    (以后代码不特意说明都是同样的编译环境)

     

    二.系统调用~~打开

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

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

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

    flags:打开文件的标志

    常见的打开标志:

    O_DONLY 只读方式打开

    O_WRONLY 只写方式打开

    O_RDWR 读写方式打开

    O_APPEND  追加方式打开

    O_CREAT 创建一个文件(当要打开的文件不存在的时候)

    O_NOBLOCK 非阻塞的方式打开------------------------(这个到现在还不是很明白什么是非阻塞,希望得到大牛指点一下) 

      注意:

    使用O_CREAT标志,需要使用第二种函数 这个函数中的第三个参数是说明要建立什么样的文件

    例: 

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

    int main(int argc,char *argv[])
    {
        int fd;
        if (argc < 2)
        {
            puts("Please input the open file pathname!\n");
        exit(1);
        }
        if ((fd = open(argv[1],O_CREAT|O_RDWR,0755)) < 0)
        {
            perror("Open file failure!\n");
            exit(1);
        }
        else
        {
            printf("Open file %d success!\n",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(fd,-5,SEEK_CUR)表示将文件指针相对当前位置向前移动5个字节

    用lseek(fd,0,SEEK_END)可以测文件的长度,因为其返回值就是相对于文件头的位置。

    七.系统调用~~访问判断 

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

    pathname:文件名称

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

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

     

     八.综合实例 ~~copy程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    #define BUFFER_SIZE 1024

    int main(int argc,char *argv[])
    {
        int from_fd,to_fd;
        int bytes_read,bytes_write;
        char buffer[BUFFER_SIZE];
        char *ptr;
        
        if (argc != 3)
        {
            fprintf(stderr,"Usage: %s fromfile tofile\n\a",argv[0]);
            exit(1);
        }
        // 打开源文件
        if ((from_fd = open(argv[1],O_RDONLY))== -1)
        {
            fprintf(stderr,"Open %s Error: %s\n",argv[1],strerror(errno));
            exit(1);
        }
        //创建目的文件
        if ((to_fd = open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1)
        {
            fprintf(stderr,"Open %s Error : %s\n",argv[2],strerror(errno));
            exit(1);
        }
        // 经典的拷贝代码———这个真的很经典
        while (bytes_read = read(from_fd,buffer,BUFFER_SIZE))
        {
            if ((bytes_read == -1) && (errno != EINTR))
                break;
            else if (bytes_read > 0)
            {
                ptr = buffer;
                while (bytes_write = write(to_fd,ptr,bytes_read))
                {
                    if ((bytes_write == -1) && (errno != EINTR))
                        break;
                    else if (bytes_write == bytes_read)
                        break;
                    else if (bytes_write > 0)
                    {
                        ptr += bytes_write;
                        bytes_read -= bytes_write;
                    }
                }
                if (bytes_write == -1)
                    break;
            }
        }
        close(from_fd);
        close(to_fd);
        exit(0);


    欢迎各位大神指正批评 ·········

    ----------------------------------------------在穷无非讨饭,不死终会出头。
  • 相关阅读:
    Java 面向对象_继承
    Java 面向对象
    使用 pykafka 进行消费
    oracle 的分页、截断查询
    Day03
    Day02 计算机的组成与编程语言
    Day01 MarkDown的使用
    Java方法的重点
    Scanner的小细节
    Java包机制和Javadoc的使用
  • 原文地址:https://www.cnblogs.com/scrat/p/2556171.html
Copyright © 2020-2023  润新知