文件IO和系统IO

一、文件io的概念


IO:input/output

文件IO:硬件的IO——对硬件进行数据的输入与输出

二、文件的操作


以文件为单位对磁盘进行操作

FILE *这个指针也叫作文件流指针——通过这个指针对指定的文件进行操作

(一)FILE *fopen(char *filename ,char *mode)

filename:文件名——用户对文件标识区分

mode:文件打开方式——决定了我们能够对文件要进行什么操作

r:以只读方式打开文件(若文件不存在就会出错)

w:以只写方式打开文件(若文件不存在会创建新文件,若文件存在则会清空文件原有内容 )

a:以追加写方式打开文件(若文件不存在会创建新文件,若文件存写入数据时总是追加到文件末尾)

r+:以可读可写方式打开文件(若文件不存在就会出错),文件存在从文件起始位置操作数据(写入的话会覆盖原有数据)

w+:以可读可写方式打开文件(若文件不存在会创建新文件,若文件存在则会清空文件原有内容 )

a+:以可读&追加写方式打开方式(若文件不存在会创建新文件,若文件存写入数据时总是追加到文件末尾)

r+,w,w+写入数据时默认都是从起始位置覆盖写入;a会将读写位置先移动到文件末尾,然后再写入数据

b:以二进制形式打开文件,默认是以文本形式打开(在文本模式下操作\n换行就会被解释成为\r\n写入文件)

返回值:成功返回文件流指针——文件的操作句柄;失败则返回NULL。接下来文件所有操作都是文件流指针进行的。

句柄:例如有一个空调,操作是通过遥控进行的,就说遥控是空调的句柄。

 

模式描述文件可否存在
r以只读方式打开文件(若文件不存在就会出错)必须存在
w以只写方式打开文件(若文件不存在会创建新文件,若文件存在则会清空文件原有内容 )若存在,则清空后再写入
a以追加写方式打开文件(若文件不存在会创建新文件,若文件存写入数据时总是追加到文件末尾)若不存在,则创建新文件写入
r+以可读可写方式打开文件(若文件不存在就会出错),文件存在从文件起始位置操作数据(写入的话会覆盖原有数据)必须存在
w+以可读可写方式打开文件(若文件不存在会创建新文件,若文件存在则会清空文件原有内容 )若存在,则清空后再写入
a+以可读&追加写方式打开方式(若文件不存在会创建新文件,若文件存写入数据时总是追加到文件末尾)若不存在,则创建新文件写入
b以二进制文件形式打开,一般都是跟着r、w、a使用视情况而定

 

(二)size_t fwirte(char *buf,size_t bsize,size_t nmen,FILE *fp)


buf:buf是一块内存空间地址,表示要把哪块空间中的数据写入文件中。

bsize:块大小   nmem:块个数       

bsize*nmenm:实际要将buf中多少字节的数据写入文件

fp:fopen返回文件流指针

返回值:成功返回实际写入文件的完整块个数;失败则返回小于nmem大小的数字

ps:当磁盘剩余空间只有10个字节,因此只能写入2.5个int数据,返回值就为2

(三)size_t fread(char *buf,size_t bsize,size_t nmen,FILE *fp)

buf:buf是一块内存空间地址,表示把从文件读取到的数据放到内存的buf这块空间中。

bsize:块大小   nmem:块个数

bsize*nmenm:实际要从文件读取多少数据

fp:fopen返回文件流指针

返回值:成功返回nmem,失败返回实际读取到的完整块个数

(四)int ferror(FILE *fp)


功能:用于判断上一步文件操作是否成功,通常是fread之后用于判断数据是否成功

返回值:没有错误则返回非0值,上一次操作出错则返回false

(五)int feof(FILE *fp)


功能:判断当前是否读取文件内容(文件读写位置)到达了文件末尾

返回值:没有错误则返回非0值,上一次操作出错则返回0

(六)int fseek(FILE *fp,size_t offset,size_t whence)


fp:文件流指针——操作句柄

offset:偏移量

whence:相对偏移的起始位置

SEEK_SET文件起始位置    SEEK_CUR当前读写位置   SEEK_END文件末尾

功能:将文件的读写位置跳转到从whence位置偏移offset个字节处(跳转到哪里,读写数据就是从哪里开始)

返回值:失败返回非0,成功则返回0

(七)int fclose(FILE *fp)


功能:关闭文件,释放资源

fp:fopen返回的操作句柄

返回值:成功返回0

二,系统IO


标准IO其实际上是间接调用系统IO实现的,标准IO有缓冲区,系统IO没有缓冲区。

因此标准IO更适合操作普通文件,系统IO更适合操作设备文件。

Linux IO的相关API

1,打开文件


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

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

        @pathname: 要打开或创建的文件名(带路径)

        @flags: 打开标志。告诉系统是以何种方式打开这个文件

        O_RDONLY: read only 只读方式

        O_WRONLY: write only 只写方式

        O_RDWR : 可读可写方式

        以上三个标志必选其一

        O_APPEND: append追加方式,打开后光标在文件末尾

        O_CREAT: create创建标志位(如果文件不存在,则创建)

        O_EXCL: 该标志一般和O_CREAT配合使用,用来测试文件是否存在

        指定O_EXCL|O_CREAT,如果文件存在,则open失败,并且 errno==> EEXIST

        O_NONBLOCK: non block 非阻塞方式打开文件

        该标志位如果设置,则为非阻塞方式打开

        该标志位如果不设置,默认为阻塞方式打开

        O_TRUNC: truncate,截断标志

        如果文件存在,并且是一个普通文件,而且打开方式为O_RDWR/O_WRONLY,

则文件内容会被清空。

...

以上标志,可以用 | 来组合

@mode: 当第二个参数指定了 O_CREAT(创建标志),那么就必须有第三个参数mode来指定

创建的文件的权限,有两种指定方式

(1) user:   S_IRUSR  S_IWUSR   S_IXUSR  ==> S_IRWXU

group:  S_IRGRP  S_IWGRP   S_IXGRP  ==> S_IRWXG

other:  S_IROTH  S_IWOTH   S_IXOTH  ==> S_IRWXO

eg:  S_IRUSR | S_IWUSR | S_IRGRP

(2)用八进制表示

0664 ==> user:可读可写  group:可读可写  other:只读

返回值:

如果成功,返回文件描述符(>0的整数,后续所有对该文件的操作都必须通过它,因为它就代表了这个文件)

如果失败,返回-1,并且errno被设置。

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

<===>  open(pathname, O_CREAT , mode)

2,关闭文件


       int close(int fd);

@fd: 指定要打开的那个文件的文件描述符(open的返回值)。返回值:成功返回0 ,失败返回-1

3,读/写


读:read用来从fd指定的文件中,读取count个字节的数据,保存到buf指向的内存空间

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

返回值:

>0 : 实际读取到的数据的个数

=0 : 到达文件末尾了(文件结束了)

<0 : 出错了,同时errno被设置

写:write用来把buf指向的内存空间的数据写入到fd指定的文件中,写count个字节的数据

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

返回值:

>0 : 实际写入到文件的数据的个数

=0 :什么都没写

<0 : 出错了,同时errno被设置

4,重定位


lseek用来把fd指定的文件进行光标重定位

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

返回值:

成功,返回新的光标位置距离文件开头的偏移量

失败,返回-1
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值