Linux标准I/O基础及函数介绍

本文详细介绍了标准I/O流的概念及使用方法,包括流的定向、缓冲管理、文件的打开与关闭、数据读写及定位等操作,并探讨了格式化输入输出函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.流和FILE对象

对于ASCII字符集,一个字符用一个字节表示;对于国际字符集,一个字符可用多个字节表示。

  • 标准I/O文件流可用于单字节或多字节字符集。
  • 流的定向决定了所读、写的字符是单字节还是多字节的。
  • 当对一个未定向的流使用单(多)字节I/O函数,则将该流的定向设置为字节(宽)定向。
  • 只有两个函数可以改变流的定向:
    • freopen函数清除一个流的定向。
    • fwide函数设置流的定向。

2.流的定向

#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp, int mode);
// 返回值:若流是宽定向的则返回正值,若流是字节定向的则返回负值,若流是未定向的则返回0

根据mode参数的不同值,fwide函数执行不同的工作:

mode 说明
负值 使流是字节定向
正值 使流是宽定向
0 不设置流的定向,但返回该流定向的值

fwide无出错返回,在调用前应该先清空errno,返回时检查errno的值来判断是否出错。

3.标准输入、标准输出和标准错误

标准I/O为每个进程自动开启三个流:标准输入标准输出标准错误。这三个标准I/O流通过预定义文件指针stdinstdoutstderr加以引用。

4.缓冲

标准I/O提供了三种类型的缓冲:

  • 全缓冲:填满标准I/O缓冲区后才进行实际I/O操作。
  • 行缓冲:在遇到换行符时执行实际I/O操作。
  • 无缓冲:不对字符进行缓冲存储。

stdinstdout默认是行缓冲,而stderr默认是无缓冲的。

使用setbufsetvbuf函数可自行设置流的缓冲类型,函数原型如下:

#include <stdio.h>
void setbuf(FILE *fp, char* buf);
int setbuf(FILE *fp, char* buf, int mode, size_t size);
// 返回值:若成功则返回0,若出错则返回非0值

在调用setbuf函数时,若buf是NULL,则关闭该流的缓冲;若buf不为NULL则必须指向一个长度为BUFSIZ的缓冲区,此时该流是全缓冲的。

setvbuf函数可以通过mode参数精确地指定所需的缓冲类型:

mode 说明
_IOFBF 全缓冲,buf和size可指定缓冲区及其长度
_IOLBF 行缓冲,buf和size可指定缓冲区及其长度
_IONBF 无缓冲,忽略buf和size参数

当mode为_IOFBF或_IOLBF时,若buf是NULL,则标准I/O库将自动地为该流分配BUFSIZ长度的缓冲区。

如果不想等待缓冲,立即执行I/O操作,可以调用fflush函数冲洗一个流。

#include <stdio.h>
int fflush(FILE *fp);
// 返回值:若成功则返回0,若出错则返回EOF

若fp是NULL࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值