读写操作

来源:互联网 发布:python 元组 相等 编辑:程序博客网 时间:2024/05/21 22:55
/**
 * @file demo1.c
 * @Synopsis  file open operation
 *
 *  和标准C区别
 *  open
 *  read
 *  write
 *  close
 *
 * typedef struct FILE{
 *  
 * }*FILE
 *
 * FILE *fopen(const char *path,const char *mode);
 * @return 地址
 *
 * int open(const char *pathname,int flags);
 * @return 整形,执接返回文件描述符不再是文件对象了
 *
 * int open(const char *pathname,int flags,mode_t mode);
 * const char *pathname 和C相同
 * int flags 
 *      O_RDONLY    以只读方式打开
 *      O_WRONLY    以只写方式打开
 *      O_RDWR      以读写方式打开
 *      上面三个参数必需定一个,且只能定一个
 *
 *      与第三个参数 按位或的操作
 *      O_APPEND    表示追加,如果文件己有内容,这次打开文件所定的数据附加到文件的末尾而不覆盖原来的内容
 *      O_CREAT     若此文件不存在则创建它。使用些选项时需要提供第三个参数 mode,表示访问权限
 *      O_EXCL      如果同时指定了O_CREAT,而文件已经存在,则出错
 *      O_TRUNC     如果文件存在,而且为只写或可读可写成功打开,则将其长度截断(Truncate)哦0
 *      O_NONBLOCK  对于设备文件,以O_NONBLOCK 方式打开可以做非阻塞I/O(Nonblock I/O);
 *  0101000011.....
 *  O_RDONLY|O_WRONLY pass 111....1101..
 * mode_t mode
 *      是文件的rwx 权限,可以用八进制数表示,比如 0644 表示 rw-r--r--,也可以用 S_IRUSR,S_IWUSR
 *      等宏定义按位或起来表示
 *      umask 022   0664&~022 = (110 110 110&~000 010 010) = (110 110 110 & 111 101 101)
 *
 * 0664 110 110 100  rw-rw-r--
 * 
 *
 * ssize_t read(int fd,void *buf,size_t count);
 * @param int fd 文件描述符
 * @param void *buf
 * void & void *    void * 指的是泛型 ,void 指的是没有反回值,就是空
 * void * 可以取任意类型,不限定类型,不管什么类型,都按一个一个字节处理
 * @return ssize_t   ...typedef...
 * size_t & ssize_t 无符号与有符号区别 ssize_t 可能为负数
 * ssize_t <= count
 * error ssize_t=-1
 * ssize_t = 0 没有东西
 * ssize_t write(int fd,const void *buf,size_t count);
 * ssize_t<=count 实际写了多少个,就反回多少个
 *
 * int close(int fd);// ********
 * @param size_t count
 *
 *
 * @author MrClimb
 * @version 1.1.0
 * @date 2012-05-08
 */


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


/* *************************************************************** */
/**
 * @Synopsis  以只读方式打开一个不存在的文件
 */
/* *************************************************************** */
void test1()
{
    int fd=0;
    fd = open("testfile",O_RDONLY);
    if(fd<0)
    {
        printf("failure fd = %d\n",fd);
        perror("open testfile");
        exit(EXIT_FAILURE);
    }
    printf("success fd = %d\n",fd);
    // NO such file or directory
}


/* *************************************************************** */
/**
 * @Synopsis  以只写方式打开一个己存在的目录。注意,如果用open 打开一个目录,目录名的末尾可以加 '\'也可以不
 * 加'\',这一点和fopen 函数一样
 */ 
/* *************************************************************** */
void test2()
{
    int fd=0;
    fd = open("/t20120508/",O_WRONLY);
    if(fd<0)
    {
        printf("failure fd = %d\n",fd);
        perror("open t20120508 dir");
        exit(EXIT_FAILURE);
    }
    // open return 3
    printf("success fd = %d\n",fd);
}


/* *************************************************************** */
/**
 * @Synopsis  在当前目录下读写一个文件,如果文件不存在则创建之,但是不巧
 * 当前目录下己有一个同名子目录
 */
/* *************************************************************** */
void test3()
{
    int fd = 0;
    fd = open("./demo1.txt",O_RDWR|O_CREAT,0644);
    if(fd<0)
    {
        printf("failure fd = %d\n",fd);
        perror("open demo1.txt");
        exit(EXIT_FAILURE);
    }
    printf("success fd = %d\n",fd);
}


/* *************************************************************** */
/**
 * @Synopsis  打开文件,用于写操作,以追加方式打开
 */
/* *************************************************************** */
void test4()
{
    int fd=0;
    fd = open("./demo1.txt",O_WRONLY|O_APPEND);// O_CREATE
    if(fd<0)
    {
        perror("file demo1.txt");
        exit(EXIT_FAILURE);
    }
}


/* *************************************************************** */
/**
 * @Synopsis  打开文件,用于写操作,如果该文件不存在则创建它
 */
/* *************************************************************** */
void test5()
{
    int fd=0;
    fd = open("./demo1.txt",O_WRONLY|O_CREAT);
    if(fd<0)
    {
        perror("file demo1.txt");
        exit(EXIT_FAILURE);
    }
}


/* *************************************************************** */
/**
 * @Synopsis  打开文件,如果该文件己存在则截断它,如果该文件不存在则创建它
 */
/* *************************************************************** */
void test6()
{
    int fd=0;
    fd = open("./demo1.txt",O_WRONLY|O_TRUNC|O_CREAT);//
    if(fd<0)
    {
        perror("file demo1.txt");
        exit(EXIT_FAILURE);
    }
}
int main(int argc, char **argv)
{
#if 0
    test1();
#endif
#if 0
    test2(); ////////////////////????
#endif
#if 0
    test3();
#endif
#if 0
    test4();
#endif


#if 0
    test5();
#endif
#if 0
    test6();
#endif
    return EXIT_SUCCESS;
}



0 0
原创粉丝点击