Chapter5-标准I/O库(上)-「APUE读书笔记」

来源:互联网 发布:属下知罪by枯目结局 编辑:程序博客网 时间:2024/05/16 00:58
  • 流和FILE对象

1、标准I/O库不同于一般的I/O函数,它们的操作是围绕而不是文件描述符。当用标准I/O库打开或创建一个文件时,也就是让一个流与一个文件相关联。

2、标准I/O流可用于单字节或多字节字符集,这由流的定向来决定。

3、在未定向的流上使用多字节I/O函数就将流设置为宽定向,使用单字节就将流设置为字节定向。

4、只有函数freopen(清除流定向)和fwide(设置流定向)可改变流的定向。

函数 fwide

#include<stdio.h>

#include<wchar.h>

//当mode为负,fwide将试图设置流为字节定向;为正时,设置为宽定向;为0时,返回当前定向

int fwide(FILE* fp, int mode); 

当流为宽定向返回正值,字节定向返回负值,未定向返回0。

fwide不能改变已定向的流,而且没有出错返回(可通过errno获取出错)。

5、没有必要对FILE对象进行检验。

  • 缓冲

1、预定义的三个流:stdin(STDIN_FILENO), stdout(STDOUT_FILENO), stderr(STDERR_FILENO)。

2、标准I/O提供三种缓冲:

全缓冲:在填满标准I/O缓冲区后才进行实际操作。

行缓冲:在输入和输出中遇到换行符时进行操作。在流涉及终端时,通常用行缓冲。

不带缓冲:标准错误流stderr。

3、默认缓冲类型:标准错误不带缓冲,指向终端的流为行缓冲,其余是全缓冲。

4、更改缓冲类型函数setbuf/setvbuf

#include<stdio.h>

//buf指定缓冲区,设置成全缓冲,部分设备会将终端相关的流设置为行缓冲,buf为NULL,则设置成不带缓冲

void setbuf(FILE* restrict fp, char* restrict buf);

//mode参数(_IOFBF/全缓冲,_IOLBF/行缓冲,_IONBF/不带缓冲)

void setvbuf(FILE* restrict fp, char* restrict buf, int mode, size_t size);

指定不带缓冲的I/O流时,忽略buf和size;如果流本身带缓冲,而buf为NULL,将自动分配适当的缓冲区,长度为BUFSIZ。

5、通常应由系统分配缓冲区,那样I/O库会在流关闭时自动释放缓冲区。

6冲洗函数fflush

#include<stdio.h>

int fflush(FILE* fp);

此函数将未写的数据传送至内核,当fp为空时,冲洗所有输出流。

  • 打开流

1打开标准I/O流函数

#include<stdio.h>

// 打开路径为pathname的文件,成功返回文件指针,错误返回NULL

FILE* fopen(const char* restrict pathname, const char* restrict type);

//关闭(若已打开)指定流,并在其上面打开文件。返回同上。

FILE* freopen(const char* restrict pathname, const char* restrict type, FILE* restrict fp);

//使一个已有的文件描述符与流结合。返回同上。通常用于管道和网络通信。

FILE* fdopen(int fd, const char* type);

type参数值:

r/rb                      为读而打开

w/wb                  截断文件,或为写而创建

a/ab                          追加,在文件尾写,或为写而创建

r+/r+b/rb+                 为读和写打开

w+/w+b/wb+            截断文件,或为读和写打开

a+/a+b/ab+              在文件尾读和写而打开或创建

2、函数fclose关闭一个打开的流

#include<stdio.h>

int fclose(FILE* fp);   //成功返回0,失败返回EOF

进程正常终止,所有I/O流被冲洗并关闭。

0 0
原创粉丝点击