zoukankan      html  css  js  c++  java
  • linux c编程:文件的读写

    Linux系统中提供了系统调用函数open()close()用于打开和关闭一个存在的文件

    int open(const char *pathname,int flags)

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

    int open(const char *pathname,mode_t mode)

    其中flag代表文件的打开方式

    O_RDONLY: 以只读方式打开文件

    O_WRONLY:以只写的方式打开文件

    O_RDWR:以读写的方式打开文件

    O_CREAT:若打开的文件不存在,则创建该文件

    O_EXCL:如果打开文件是设置了O_CREAT,但是该文件存在,则导致调用失败

    O_TRUNC:如果以只写或只读方式打开一个已存在的文件,将该文件截至0

    O_APPEND:追加的方式打开文件

    O_NONBLOCK:用于非堵塞接口i/o

    O_NODELAY

    O_SYNC:当数据被写入外存或者其他设备后,操作才返回。

    其中mode是打开的权限

    S_IRWXU 00700 设置文件所有者的读,写,执行权限

    S_IRWXG 00070 设置文件所在用户组的读,写,执行权限

    S_IRWXO 00007 设置其他用户的读,写,执行权限

    S_IRUSR 00400 设置文件所有者的读权限

    S_IWUSR 00200 设置文件所有的写权限

    S_IXUSR 00100 设置文件所有者的执行权限

    S_IRGRP 00040 设置用户组的读权限

    S_IWGRP 00020 设置用户组的写权限

    S_IXGRP 00010 设置用户组的执行权限

    S_IROTH 00004 设置其他用户的读权限

    S_IWOTH 00002 设置其他用户的写权限

    S_IXOTH 00001 设置其他用户的执行权限



    文件的读操作:

    ssize_t read(int fd,void *buf,size_t count);

    fd代表文件描述符,buf代表读取的数据存放的buf指针所指向的缓冲区,count代表读取数据的字节数

    函数调用成功,返回为读取的字节数,否则返回-1


    文件读和写的例子

    void open_and_read_file()

    {

    int fd,n;

    char buf[100];

    char *path="/home/zhf/zhf/c_prj/c_test.txt";

    fd=open(path,O_RDWR);

    n=read(fd,buf,20);

    printf("the content is %s ",buf);

    }


    在这里文件都是从头开始读的,那么如果我想从某个位置比如第N个字节开始读取的时候该如何操作呢,这里就需要用到文件定位函数lseek

    off_t lseek(int fildes,off_t offset,int whence);

    fildes是文件描述符

    offset是偏移量

    whence代表用于偏移时的相对位置,可以取如下的几个值

    SEEK_SET: 从文件的开头位置计算偏移量

    SEEK_CUR: 从当前的位置开始计算偏移量

    SEEK_END: 从文件的结尾开始计算偏移量

    函数修改如下: 首先采用lseek函数将文件定位到从第11个字节开始,然后read将从第11个字节开始读取。

    对于写操作也是一样的。

    void open_and_read_file()

    {

    int fd,n;

    char buf[100];

    char *path="/home/zhf/zhf/c_prj/c_test.txt";

    int i;

    fd=open(path,O_RDWR);

    i=lseek(fd,11,SEEK_SET);

    n=read(fd,buf,20);

    printf("the content is %s ",buf);

    close(fd);

    }


    一个完整的创建,读,写文件的例子:

    #include <fcntl.h>
    #include <stdio.h>
    #include <unistd.h>

    void write_file(int fd){
        char buf[]="abcde ";
        write(fd,buf,sizeof(buf));

        close(fd);
    }

    void read_file(){
        int fd;
        char *path="/home/zhf/test1.txt";
        char result[20];
        fd=open(path,O_RDONLY);
        read(fd,result,10);
        printf("The content is %s",result);
        close(fd);
    }

    int create_file(){
        int fd;
        char *path="/home/zhf/test1.txt";
        fd=creat(path,00777);
        return fd;
    }


    前面介绍的操作都是基于文件描述符的文件操作,下面来介绍基于流的文件操作。两者有什么区别呢:

    缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。主要有fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind
    2.
    非缓冲文件系统
    缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度 快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。本书只作简单介绍。open, close, read, write, getc, getchar, putc, putchar 等。

    open
    是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopenC的库函数,返回的是一个指向文件结构的指针。
    linux
    中的系统函数是openfopen是其封装函数。fopen可以移植,open不能



    来看fopen函数:FILE *fopen(const char *path,const char *mode)

    path代表文件名路径

    mode代表文件的打开方式。有 r,r+,w,w+,a,a+等方式

    fgetc()函数:从文件读取1个字节 int fgetc(FILE *stream). 如果出错或者读到文件末尾,则返回EOF

    fputc()函数:向指定的文件写入1个文件 int fputc(int c,FILE *stream);

    实例代码:

    void fopen_file()

    {

    int i;

    char ch;

    FILE *fp;

    char *path="/home/zhf/zhf/c_prj/c_test.txt";

    fp=fopen(path,"r");

    for(i=0;i<5;i++)

    {

    if ((ch=fgetc(fp)) != EOF)

    {

    printf("%c",ch);

    }

    }

    }

    fputcfgetc函数只能一次性的读取或者写入一个字节,如果想读取或者写入一个字符串则需要用到fgets()fputs()函数。

    Char *fgets(char *s,int size, FILE *stream);

    读取到’转移字符为结束,并在该行末尾添加一个’组成完成的字符串。在size字节范围内没有读到’结束符,则添加一个’

    int fputs(const char *s, FILE *stream);

    void fopen_file()

    {

    int i;

    char ch;

    char *str;

    FILE *fp;

    char *path="/home/zhf/zhf/c_prj/c_test.txt";

    char result[100];

    fp=fopen(path,"r");

    str=fgets(result,20,fp);

    printf("%s ",str);

    fclose(fp);

    }



    同样的基于流操作的也有文件的定位操作函数分别是fseek函数和rewind函数

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

    这里offset表示移动的字节数,要求位移量是long型数据。以便在文件长度大于64Kb不会出错

    whence和前面介绍的一样。

    rewind函数的作用是使位置指针重新返回文件的开头,函数没有返回值。

  • 相关阅读:
    查看Oracle的redo日志切换频率
    MySQL 5.6 my.cnf 参数说明(转)
    MySQL性能优化之参数配置
    centos7安装mysql(MariaDB)
    centos6.5安装sendmail
    zabbix安装配置
    linux设置安全连接设置(私钥)
    linux本机root账户无法登录,但是远程ssh可登录
    ORACLE AWR
    maven 依赖(依赖范围,聚合,继承等)
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7726199.html
Copyright © 2011-2022 走看看