Linux应用软件编程:文件IO 缓冲区 其他函数接口

6、文件IO

文件IO:Linux内核提供的文件操作接口。属于系统调用

函数接口:

打开文件---》读写文件---》关闭文件

open

read、write

close

  • open

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

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:打开一个文件,并获得一个文件描述符

参数:

pathname:要打开文件的文件名

flags:打开方式

O_RDONLY:只读

O_WRONLY:只写

O_RDWR:读写

O_CREAT:创建

O_TRUNC:清空

O_APPEND:追加

”r“     O_RDONLY

”r+“   O_RDWR

”w“    O_WRONLY | O_TRUNC | O_CREAT

"w+"  O_RDWR  | O_TRUNC | O_CREAT,0664

"a"     O_WRONLY | O_CREAT | O_APPEND,0664

"a+"   O_RDWR | O_CREAT | O_APPEND,0664,0664

mode:用户、同组用户、其他用户会该文件的读写执行权限

(mode & ~umask)

普通文件:0664

权限给满:0777(rwxrwxr-x

返回值:

成功:文件描述符

失败:-1

文件描述符:

当打开一个文件时,系统会为已打开的文件分配一个文件描述符用来标记该文件。

文件描述符:小的、非负的整形数据

操作系统默认可分配出的描述符:0~1023

文件描述符分配原则:最小未被使用

系统默认已打开的文件:

标准IO        文件IO

FILE*           int

stdin             0(STDIN_FILENO)

stdout           1(STDOUT_FILENO)

stderr           2(STDERR_FILENO)

  • close

#include <unistd.h>

int close(int fd);
 

功能:关闭文件

参数:

fd:文件描述符

返回值:

成功:0

失败:-1

注意:

只打开文件,不关闭文件,会造成文件描述符泄漏

  • write

#include <unistd.h>

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

功能:

向文间中写入数据

参数:
fd:被写入文件的文件描述符

buf:要写入数据的首地址

count:希望写入的字节数

返回值:

成功:实际写入的字节数

失败:-1

  • read

#include <unistd.h>

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

功能:从文件中读取数据

参数:

fd:要读取文件的文件描述符

buf:存储读取数据的空间首地址

count:希望读到的字节数

返回值:

成功:实际读到的字节数

失败:-1

到达文件末尾:0

文件定位函数:

  • lseek

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

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

功能:重新定义文件的读写位置

参数:

fd:文件描述符

offset:偏移量

whence:要偏移的起始位置

        SEEK_SET:从文件开头偏移

        SEEK_CUR:从当前读写位置偏移

        SEEK_END:从文件末尾偏移

返回值:

成功:返回当前读写位置到文件开头的偏移量

失败:-1

7、文件IO / 标准IO对比

标准IO

文件IO

操作对象(FILE *)文件流指针(int)文件描述符
来源标准C库,可移植性强Linux系统调用,可移植性弱
缓冲区

有缓冲区,目的是减少用户层

和内层反复切换,提高效率

无缓冲区,实时性好
应用场景普通文件的操作普通文件、硬件相关的文件

缓冲区

(1)行缓冲

默认大小1024字节(1k),使用在人机交互的终端上

刷新条件:

  • 遇到‘\n’;
  • 程序结束时刷新;
  • 缓冲区满刷新
  • fflush(stdout)强制刷新

(2)全缓冲

默认大小4096字节(4k),文件交互

刷新条件;

  • c程序运行结束
  • 文件关闭,自动刷新
  • 全缓冲区满刷新
  • fflush(fp)强制刷新

(3)无缓冲

0k,出错信息输出,标准出错设备

stdeer

8、其他函数接口

int printf(const char *format, ...);


int fprintf(FILE *stream, const char *format, ...);

功能:将格式化后的字符串写入到stream文件流代表的文件中


int dprintf(int fd, const char *format, ...);

功能:将格式化后的字符串写入到fd文件描述符代表的文件中


int sprintf(char *str, const char *format, ...);
功能:将格式化后的字符串写入到字符型数组钟

应用:

  • 字符串的拼接、格式化
  • 整形,浮点型转转字符串
char *p="hello";
char *q="world";
char str[32]={0};
 
sprintf(str,"%s  %s",p,q);

 #include <string.h>

char *strtok(char *str, const char *delim);

功能:字符串截取函数

参数:

str:要截取的原始字符串

delim:要截断的分隔符

返回值:

成功:截取到的子字符串的首地址

失败:NULL(已经到字符串末尾)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值