IO超级总结

文件:一组数据的集合。
文件名:集合的名称。
Linux系统下的7种文件类型:

b	block		块设备文件
c	character	字符设备文件
d	directory	目录文件
-			普通文件
l	link		链接文件
s	socket		套接字文件
p	pipe		管道文件

IO: 输入/输出。
输入: 数据由外部流向进程内部。例如读键盘、读磁盘、接受网络数据等。
输出: 数据由进程内部流向外部。例如向屏幕打印、写入磁盘、发送网络数据等。

标准IO: 是由C标准库提供的函数接口, 有缓存,是高级IO, 可移植性较高(在几乎所有支持标准C库的系统下都可以运行)。
用FILE *的文件流指针标记打开的文件。
文件IO: 是由Linux内核提供的函数接口, 无缓存, 是低级IO, 可移植性较低(只能在LINUX/UNIX系统下运行)。
用int的文件描述符标记打开的文件。

linux系统下,终端启动的进程默认打开3个IO通道:
标准输入:stdin
标准输出:stdout
标准出错:stderr

缓存: 为了平衡高速设备以及低速设备之间的速度差异而设定的块内容,用来临时存放数据。缓存可以极大地提高系统的整体运行效率。
缓存的分类:
行缓存:只有满一行(遇到换行符)才刷新缓存(将数据写入设备并清空缓存),通常是一些用来人机交互的终端设备,例如标准输入。
满缓存:只有缓冲区满才刷新缓存,通常是普通的文件。
不缓存:没有缓冲区,进程的输出数据将直接写入内核。通常是一些对实时性有严格要求的设备(如stderr)。
补充:
所有的缓冲的刷新方式除了以上之外,还可以发生在:fflush之后、缓冲区满、进程正常终止(主函数return或调用exit)。

操作文件流缓冲的接口:
setvbuf

流:对数据的一种操作方式, 流抽象了一种先进先出后进后出的通道,使得用户只需要关心数据的流向,不用关心数据的尺寸、内容以及具体如何传输的。

绝对禁止函数返回自己局部变量的地址。

========================= 标准IO =================

打开:
FILE *fopen(const char *path, const char *mode)
功能:按照指定的模式打开或创建一个文件。
返回值:成功返回FILE *的指针, 失败返回NULL;
参数:
1.const char *path, 需要打开或创建的文件名字。
2.cosnt char *mode, 指定打开的模式:
"r": 以只读模式打开一个文件,如果不存在则出错返回。
"r+":以读写模式打开一个文件, 如果不存在则出错返回。
"w": 以只写方式打开一个文件,如果存在则清空,不存在则创建。
"w+":以读写方式打开一个文件,如果存在则清空, 不存在则创建。
"a": 以只写追加方式打开一个文件, 如果存在则定位到文件末尾写入,否则创建。
"a+":以读写追加方式打开一个文件, 如果不存在则创建, 文件存在则位置指针在写入时定位到末尾, 读取时定位开头。
关闭:
int fclose(FILE *fp)
功能:关闭一个文件流。
返回值:成功0, 失败-1。
参数:
FILE *fp, 一个文件流指针(通常由fopen返回)。
写入:
int fputs(const char *str, FILE *fp);
功能:把str指向的字符串写入fp指向的文件流中。
返回值:
成功返回非负的整数, 失败返回EOF.
参数:
1.const char *str, 要写入的字符串。
2.FILE *fp, 要写入的文件流指针。
int fwrite(const void *buff, size_t size, size_t n, FILE *fp);
功能: 将存在于buff的n块数据写入文件,每块大小是size字节。
返回值:成功返回写入的块数, 失败返回一个比n小的数或0.
参数:
1. const void *buff, 用户的数据空间地址。
2. size_t size, 每块数据的大小。
3. size_t n, 期望写入的数据块数。
4. FILE *fp, 文件流指针。
fputc
fprintf
读出:
char *fgets(char *buff, size_t size, FILE *fp);
功能: 从一个文件流中读取顶多size-1个字符的一行字符串,并存储到buff指向的缓冲区中。
返回值:成功返回buff, 出错或者到达文件末尾则返回NULL。
参数:
1. char *buff, 用户自己指定的缓冲区地址。
2. size_t size, 用户指定缓冲区的大小。
3. FILE *fp, 要读的文件流指针。
int fread(void *buff, size_t size, size_t n, FILE *fp);
功能: 从文件流fp中读取n块数据存放到buff中,每块大小是size字节。
返回值:成功返回实际读到的块数(而不是字节数), 失败返回比期望小的数或0.	
参数:
1. void *buff, 用户的数据空间地址。
2. size_t size, 每块数据的大小。
3. size_t n, 期望读取的数据块数。
4. FILE *fp, 文件流指针。
fgetc
fscanf
定位:
int fseek(FILE *fp, long offset, int whence);
功能:设定文件流的文件位置指示器。
返回值: 成功,0; 失败, -1;
参数:
1. FILE *fp, 文件流指针。
2. long offset, 偏移量,以字节为单位。
3. int whence, 起始位置:
SEEK_SET: 从文件头开始。
SEEK_CUR: 从当前位置开始。
SEEK_END:从文件尾开始。
long ftell(FILE *fp);
功能:返回文件当前的位置偏移量。
返回值:long, 文件的位置偏移量(相对于文件头, 以字节为单位);
参数:
FILE *fp, 文件流指针。
void rewind(FILE *fp);
功能:将fp指向的文件流的位置指针重置为开头。
返回值:无,不会失败。
参数:
FILE *fp, 需要重定位的文件流指针。
临时文件:

FILE *tmpfile(void);
功能: 创建并打开一个无名临时文件。
返回值:成功, FILE *fp; 失败, NULL;
参数: 无。
char *tmpnam(char *buff);
功能: 生成一个唯一的临时文件名(但是并没有创建文件,需要用户自己手动建)。
返回值: 成功,文件名的指针; 失败, NULL;
参数:
char *buff: 用户可以指定接受名字的缓冲区,此时该函数会将文件名写入用户指定的缓冲区;或者传递NULL,此时文件名通过函数的返回值返回。

============================ 文件IO =============

文件描述符是一个非负的整数,用来在进程中唯一标记一个打开的文件。
每次打开文件,系统总是选取当前进程中未被使用的最小的编号,作为本次的文件描述符。
每个进程默认能够打开的文件个数是1024个,因此文件描述符的范围是0 ~ 1023。
每个进程默认会打开3个文件:
标准输入:0
标准输出:1
标准出错:2
因此一般情况下,用户打开的第一个文件描述符通常是3。

打开:
只打开不创建:
int open(const char *path, int flag);
创建并打开:
int open(const char *path, int flag, mode_t mode);
功能:打开或创建并打开一个文件。
返回值:成功,非负整数;失败, -1;
参数:
1. const char *path, 需要打开或创建的文件路径。
2. int flag, 文件标志位(创建、状态等标志位):
O_CRAET、O_APPEND、O_RDONLY、O_WRONLY、O_RDWR、O_TRUNC、O_EXCL
3. mode_t mode, 在创建文件时(O_CRAET)有效,指定新文件的权限,如0644。

创建并打开文件:
creat();	等价于 open(fname,O_CREAT | O_WRONLY | O_TRUNC, mode);
关闭:
int close(int fd);
功能: 关闭一个文件描述符。
返回值: 成功, 0; 失败, -1;
参数:
int fd, 已经打开的文件描述符。
读取:
ssize_t read(int fd, void *buff, size_t size);
功能: 从一个文件描述符中读取指定大小的数据。
返回值: 成功,非负整数; 失败, -1; 文件末尾, 0;
参数:
1. int fd, 需要读取的文件描述符。
2. void *buff, 用户数据缓冲区,用来存放读到的数据。
3. size_t size, 指定读取的数据大小,以字节为单位。其中size_t等价于unsigned int
写入:
ssize_t write(int fd, const void *buff, size_t size);
功能:向一个文件描述符中写入指定大小的数据。
返回值:成功, 实际写入的字节数;失败, -1; 未写入, 0;
参数:
1. int fd, 需要读取的文件描述符。
2. const void *buff, 用户数据缓冲区,用来存放要写的数据。
3. size_t size, 指定写入的数据大小,以字节为单位。其中size_t等价于unsigned int。
定位:
/* 等价 fseek */
off_t lseek(int fd, off_t offset, int whence);
功能:设置文件位置的偏移量,并返回新的位置。
返回值: 成功,新的文件位置; 失败, -1;off_t 等价于long。
参数:
1. int fd, 需要操作的文件描述符。
2. off_t offset, 偏移量,以字节为单位。
3. int whence, 起始位置:
SEEK_SET: 从文件头开始。
SEEK_CUR: 从当前位置开始。
SEEK_END:从文件尾开始。


/* 等价rewind */
lseek(fd, 0, SEEK_SET);

/* 等价ftell */
lseek(fd, 0SEEK_CUR);
文件状态:
stat();
其他函数接口:
getpwuid
getgrgid
remove
unlink
link
symlink
time
目录接口:
opendir
readdir
chdir
getcw
mkdir
rmdir

强烈推荐的书籍(LinuxC程序猿必备):

基础篇:
微机原理(计算机组成原理)
操作系统原理
数据结构(严蔚敏)
C语言程序设计 (K&R)
鸟哥的私房菜
高级篇:
程序员的自我修养
APUE(UNIX环境高级编程)
UNIX网络编程
TCP/IP协议详解 I
linux内核设计与实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值