文件操作

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
//#include <sys/types.h>

//#include <sys/stat.h>

#include <fcntl.h>


void main(int argc,char* argv[])
{
    struct stat buf;
    int fd1,fd2,fd3,ret,len,length;
    char cbuf[100];

    len=atoi(argv[2]);
    printf("\nfilename:%s bytes:%d",argv[1],len);


    fd1=creat(argv[1],0777);
    printf("\ncreate %s, fd1=%d",argv[1],fd1);


    fd2=open(argv[1],O_CREAT|O_RDWR,0777);
    printf("\nopen %s, fd2=%d",argv[1],fd2);
    ret = write(fd2,"I am hanyang!!!",strlen("I am hanyang!!!"));
    printf("\nwrite %d bytes",ret);
    close(fd2);

    fd3=open(argv[1],O_CREAT|O_RDWR,0777);
    printf("\nopen %s, fd3=%d",argv[1],fd3);
    ret = read(fd3,cbuf,len);
    printf("\nread %d(%d) bytes:%s",len,ret,cbuf);
    close(fd3);

    stat(argv[1], &buf);
    printf("\n%s file size = %d ",argv[1],buf.st_size);

    fd3=open(argv[1],O_CREAT|O_RDWR,0777);
    length = lseek(fd3,0,SEEK_END);
    close(fd3);
    printf("\nlseek length:%d bytes",length);
    printf("\nremove %s\n",argv[1]);
//    remove(argv[1]);

}

*************************************************************************************************************************************************

creat

头文件:

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

#include <fcntl.h>                          // 提供open()函数  
#include <sys/types.h>                      // 提供mode_t类型  
#include <sys/stat.h>                       // 提供open()函数的符号  
#include <unistd.h>                         // 提供close()函数
 

函数定义:int creat(const char * pathname, mode_tmode)

函数说明:
1、参数 pathname 指向欲建立的文件路径字符串。
2、Creat()相当于使用下列的调用方式调用open()
    open(const char * pathname, (O_CREAT|O_WRONLY|O_TRUNC));   

     filename:要创建的文件名(包括路径,默认当前路径)

     mode:创建模式,指定用户操作权限(针对三种用户设置:所处用户,所处用户组,其他用户

                               权限:读,写,执行)

(0表示没有任何权限

     S_IRUSR可读,1

     S_IWUSR可写,2

     S_IXUSR可执行,4

    S_IRWXR可读、写、执行)7(也可以用数字代替,如0777)

返回值:

文件描述符,值为一个整数,发生错误时返回-1,并把错误代码设给errno

*************************************************************************************************************************************************

remove

头文件:

#include <stdio.h>

函数定义:

int remove(const char *filename)

参数:

  • filename -- 这是 C 字符串,包含了要被删除的文件名称。

返回值:

  • 如果成功,则返回零。如果错误,则返回 -1,并设置 errno。

*************************************************************************************************************************************************

open

头文件:

#include<fcntl.h>//在centos6.0中只要此头文件就可以

#include<sys/types.h>

#incldue<sys/stat.h>

功能:打开和创建文件(建立一个文件描述符,其他的函数可以通过文 件描述符对指定文件进行读取与写入的操作。)

nt open(const char*pathname,int flags);
int open(const char*pathname,int flags,mode_t mode);
参数说明:
1.pathname
  要打开或创建的目标文件
2.flags
  打开文件时,可以传入多个参数选项,用下面的
  一个或者多个常量进行“或”运算,构成falgs
  参数:
  O_RDONLY:   只读打开
  O_WRONLY:   只写打开
  O_RDWR:     读,写打开
这三个常量,必须制定一个且只能指定一个
  O_CREAT:    若文件不存在,则创建它,需要使用mode选项。来指明新文件的访问权限
  O_APPEND:   追加写,如果文件已经有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容
 

必选参数:

O_RDONLY 只读打开

O_WRONLY 只写打开

O_RDWR 读写打开

O_EXEC 只执行打开

O_SEARCH 只搜索打开(应用于目录)----不知道什么系统支持,也不理解这是个什么鬼难过.



可选参数(使用"|"追加)

O_APPEND 每次写都追加到文件结尾.

O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志----目前不理解什么意思.

O_CREAT 此文件不存在则创建,同时可以使用可变参数设置新文件的访问权限(让我们想起umask大笑).

O_DIRECTORY 如果path引用的不是路径则出错。

O_EXCL 同时制定O_CREAT,且文件存在则出错,用于测试文件是否存在.

O_NOCTTY 如果path引用的是终端设备,则不将此设备分配作为此进程的控制终端,----不理解.

O_NOFOLLOW 如果path引用的是一个符号链接则出错.

O_NONBLOCK 如果path引用的是一个FIFO,一个特殊的块文件,一个字特殊文件,则本次打开和后续操作都是非阻塞方式.

O_SYNC 使用每次write等待物理操作完成,包括由write引起的文件属性的变更(文件大小,更新时间等信息)

O_TRUNC 文件存在且只写/读写打开,文件长度为0.

O_DSYNC 每次write等待物理IO完成,如果写不影响读,则不需要等待.

O_RSYNC 使每一个使用文件描述符作为参数进行read的操作等待,直到写全部完成.

ps:open函数具体使用那个,和具体应用场景相关,如目标文件存在,使用两个参数的open,如果目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限。

返回值

成功:新打开的文件描述符

失败:-1

open返回的文件描述符一定是最小的而且没有被使用的。

fopen与open的区别

以可写的方式fopen一个文件时,如果文件不存在则会自动创建,而open一个文件时必须明确O_CREAT才会创建文件,否则文件不存在就出错返回

*************************************************************************************************************************************************

close

头文件:#include<unistd.h>
功能:关闭一个已经打开的文件

int close(int fd)

参数说明:

fd:需要关闭的文件描述符

返回值:

成功:返回0;

失败:返回-1,并设置errno

打开的文件描述符一定要记得关闭,否则资源会被大量的占用,导致内存不够。

*************************************************************************************************************************************************

read

#include<unistd.h>

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

函数说明
read()会把参数fd    所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则
read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或
是无可读取的数据,此外文件读写位置会随读取到的字节移动。

*************************************************************************************************************************************************

write

#include<unistd.h>

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

函数说明
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置
也会随之移动。
返回值
如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno
中。

*************************************************************************************************************************************************

stat

可以测文件大小

作用:获取文件信息

头文件

include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

函数原型int stat(const char *path, struct stat *buf)

参数:文件路径(名),struct stat 类型的结构体

返回值:成功返回0,失败返回-1;

struct stat
{
    dev_t     st_dev;     /* ID of device containing file */文件使用的设备号
    ino_t     st_ino;     /* inode number */    索引节点号 
    mode_t    st_mode;    /* protection */  文件对应的模式,文件,目录等
    nlink_t   st_nlink;   /* number of hard links */    文件的硬连接数  
    uid_t     st_uid;     /* user ID of owner */    所有者用户识别号
    gid_t     st_gid;     /* group ID of owner */   组识别号  
    dev_t     st_rdev;    /* device ID (if special file) */ 设备文件的设备号
    off_t     st_size;    /* total size, in bytes */ 以字节为单位的文件容量   
    blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小   
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 该文件所占的磁盘块  
    time_t    st_atime;   /* time of last access */ 最后一次访问该文件的时间   
    time_t    st_mtime;   /* time of last modification */ /最后一次修改该文件的时间   
    time_t    st_ctime;   /* time of last status change */ 最后一次改变该文件状态的时间   
};

*************************************************************************************************************************************************

lseek

头文件
#include<sys/types.h>
#include<unistd.h>


函数原型
off_t lseek(int filde,off_t offset ,int whence);

EEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
下列是较特别的使用方式:
1) 欲将读写位置移到文件开头时:
lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文件尾时:
lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置时:
lseek(int fildes,0,SEEK_CUR);
 

返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。
可能设置erron的错误代码:
EBADF: fildes不是一个打开的文件描述符。
ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。
EINVAL:whence取值不当。
 

测文件大小:filelen= lseek(fd,0L,SEEK_END);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值