zoukankan      html  css  js  c++  java
  • Smart210学习记录-------文件操作

    一.linux文件操作(只能在linux系统上用)

    创建:
    int creat(const char* filename, mode_t mode)
    filename 表示要创建的文件名,mode表示对该文件的读写权限
    int umask(int newmask)
    调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限
    S_IRUSR 用户可以读
    S_IWUSR 用户可以写
    S_IXUSR 用户可以执行
    。。。等等
    除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux
    用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位表
    示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取 1(执
    行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。例如,要创建一个用户可读、
    可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位。那么,
    我们应该使用的模式是 1(设置用户 ID)、0(不设置组 ID)、7(1+2+4,读、写、执行)、0(没
    有权限)、5(1+4,读、执行)即 10 705:


    打开:
    int open(const char* filename, int flags)
    int open(const char* filename, int flags, mode_t mode)
    open()函数有两个形式,其中 pathname 是我们要打开的文件名
    O_RDONLY 以只读的方式打开文件
    O_WRONLY 以只写的方式打开文件
    O_RDWR 以读写的方式打开文件
    O_APPEND 以追加的方式打开文件
    O_CREAT 创建一个文件 //使用第二种形式
    O_EXEC 如果使用了 O_CREAT 而且文件已经存在,就会发生一个错误
    O_NOBLOCK 以非阻塞的方式打开一个文件
    O_TRUNC 如果文件已经存在,则删除文件的内容

    open("test", O_CREAT, 10 705) 创建一个text文件并且打开它,对它的权限用户ID读写,组ID没权限,用户自己读写运行。。。。
    如果文件打开成功,open 函数会返回一个文件描述符,以后对该文件的所有操作就可以通过
    对这个文件描述符进行操作来实现。


    读写;
    int read(int fd, const void* buf, size_t length)
    int write(int fd, const void *buf, size_t length)
    返回值为实际写入的字节数
    fd:open函数返回的文件描述符
    buf length 顾名思义

    定位:
    对于随机文件,我们可以随机地指定位置读写,使用如下函数进行定位:
    int lseek(int fd, offset_t offset, int whence)

    fd:文件描述符
    offset:相对于whence的偏移量
    whence:SEEK_SET:相对文件开头
    SEEK_CUR:相对文件读写指针的当前位置
    SEEK_END:相对文件末尾

    关闭:
    int close(int fd)
    当我们操作完成以后,我们要关闭文件了,只要调用 close 就可以了,其中 fd 是我们要关闭
    的文件描述幅

    范例:
    1 #include <sys/types.h>
    2 #include <sys/stat.h>
    3 #include <fcntl.h>
    4 #include <stdio.h>
    5 #define LENGTH 100
    6 main()
    7 {
    8 int fd, len;
    9 char str[LENGTH];
    10
    11 fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); /*
    12 创建并打开文件 */
    13 if (fd) {
    14 write(fd, "Hello World", strlen("Hello World")); /*
    15 写入字符串 */
    16 close(fd);
    17 }
    18
    19 fd = open("hello.txt", O_RDWR);
    20 len = read(fd, str, LENGTH); /* 读取文件内容 */
    21 str[len] = '';
    22 printf("%s ", str);
    23 close(fd);
    24 }


    二.c库文件操作(C库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux,还是在 VxWorks 中都是这些函数)


    创建与打开

    FILE* fopen(const char* path, const char* mode);
    mode: 打开模式 r、rb 以只读方式打开
    w、wb 以只写方式打开。如果文件不存在,则创建该文件,否则文件被截断
    a、ab 以追加方式打开。如果文件不存在,则创建该文件
    r+、r+b、rb+ 以读写方式打开
    w+、w+b、wh+ 以读写方式打开。如果文件不存在时,创建新文件,否则文件被截断
    a+、a+b、ab+ 以读和追加方式打开。如果文件不存在,则创建新文件
    其中 b 用于区分二进制文件和文本文件,这一点在 DOS、Windows 系统中是有区分的,但
    Linux 不区分二进制文件和文本文件。

    读写:

    C 库函数支持以字符、字符串等为单位,支持按照某种格式进行文件的读写,这一组函数为:

    int fgetc(FILE *stream);
    int fputc(int c, FILE *stream);
    char *fgets(char *s, int n, FILE *stream);
    int fputs(const char *s, FILE *stream);
    int fprintf(FILE *stream, const char *format, ...);
    int fscanf (FILE *stream, const char *format, ...);
    size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
    size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);

    fread()实现从流 stream 中读取加 n 个字段,每个字段为 size 字节,并将读取的字段放入 ptr
    所指的字符数组中,返回实际已读取的字段数。在读取的字段数小于 num 时,可能是在函数调用
    时出现错误,也可能是读到文件的结尾。所以要通过调用 feof()和 ferror()来判断。
    write()实现从缓冲区 ptr 所指的数组中把 n 个字段写到流 stream 中,每个字段长为 size 个字
    节,返回实际写入的字段数。
    另外,C 库函数还提供了读写过程中的定位能力,这些函数包括:
    int fgetpos(FILE *stream, fpos_t *pos);
    int fsetpos(FILE *stream, const fpos_t *pos);
    int fseek(FILE *stream, long offset, int whence);


    关闭:

    int fclose(FILE* stream);

    范例:
    #include <stdio.h>

    int main()
    {
    FILE* fd;
    char pr[15];
    fd = fopen("hello.doc", "w+");
    if (fd){
    fputs("hello world", fd);
    fcolse(fd);
    }

    fd = fopen("hello.doc", "r");
    fgets(pr, 15, fd);
    printf("%s ", pr);
    fclose(fd);
    }

    来自<<linux设备驱动开发详解>>

  • 相关阅读:
    Build 2016: 发布明天的云创新来服务今天的开发者
    微软在Build 2016开发者大会中发布 “认知服务”,牛津计划有正式名字啦!
    流行开源软件云上体验周 ——一种正确的云上开源软件体验姿势!
    让每个人都体验到来自云端的智能
    hdmap相关单词
    绝对误差和相对误差的定义
    高速公路之匝道
    hdmap相关
    虚拟参考站(VRS)
    matlab之结构体数组struct
  • 原文地址:https://www.cnblogs.com/qigaohua/p/5412912.html
Copyright © 2011-2022 走看看