0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于标准I/O库执行I/O操作

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2020-07-01 17:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 缓冲区概述

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

1、全缓冲:

在填满标准I/O缓冲区后才进行实际I/O操作。常规文件(如普通文本文件)通常是全缓冲的。

2、行缓冲:

当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/O操作。标准输入和标准输出对应终端设备(如屏幕)时通常是行缓冲的。

3、不带缓冲:

用户程序每次调库函数做写操作都要通过系统调用写回内核(如系统调用函数)。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。

2. 全缓冲

测试代码:

int main(int argc, char *argv[])

FILE *fp = NULL;

// 读写方式打开,文件不存在则创建

fp = fopen(“test.txt”, “w+”);

if(NULL == fp)

printf(“open error

return 1;

char *str = “C++程序员

fwrite(str, 1, strlen(str), fp);// 往文件写内容

while(1);// 程序阻塞在这里

return 0;

运行程序发现,test.txt并没有内容。因为常规文件通常是全缓冲的,只有缓冲区满了后,才会把内容写到文件中。接下来,我们改一下上面那个例子。

测试代码:

#include 《stdio.h》

#include 《string.h》

int main(int argc, char *argv[])

FILE *fp = NULL;

// 读写方式打开,文件不存在则创建

fp = fopen(“test.txt”, “w+”);

if(NULL == fp)

printf(“open error

return 1;

char *str = “test

int i = 0;

while(i 《= 512){// 缓冲区大小不确定,i的大小只是一个调试值

fwrite(str, 1, strlen(str), fp);// 往文件写内容

i++;

while(1);// 程序阻塞在这里

return 0;

上面的例子是循环给文件写内容,让缓冲区有填满的可能,结果发现,文件是有内容的。实际上要想成功给文件写进内容,除了缓冲区填满,还有别的方法。

2.1 人为关闭文件,就算缓冲区没有填满,内容也会写进文件

#include 《stdio.h》

#include 《string.h》

int main(int argc, char *argv[])

FILE *fp = NULL;

// 读写方式打开,文件不存在则创建

fp = fopen(“test.txt”, “w+”);

if(NULL == fp)

printf(“open error

return 1;

char *str = “test ok

fwrite(str, 1, strlen(str), fp);// 往文件写内容

fclose(fp);// 人为关闭文件,就算缓冲区没有填满,内容也会写进文件

while(1);// 程序阻塞在这里

return 0;

2.2 程序正常结束,就算缓冲区没有填满,没有关闭文件,内容也会写进文件。

#include 《stdio.h》

#include 《string.h》

int main(int argc, char *argv[])

FILE *fp = NULL;

// 读写方式打开,文件不存在则创建

fp = fopen(“test.txt”, “w+”);

if(NULL == fp)

printf(“open error

return 1;

char *str = “test ok

fwrite(str, 1, strlen(str), fp);// 往文件写内容

return 0;

// 程序正常结束,就算缓冲区没有填满,没有关闭文件,内容也会写进文件。

3. 行缓冲

#include 《stdio.h》

int main(int argc, char *argv[])

printf(“hello test”);

while(1);

return 0;

运行这个程序,会发现 hello test并没有打印到屏幕上。因为标准输入和标准输出对应终端设备时通常是行缓冲的,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。如下:

#include 《stdio.h》

int main(int argc, char *argv[])

printf(“hello test

while(1);

return 0;

除了遇到换行符,还有别的方法可以执行I/O操作。

3.1 缓冲区满

int main(int argc, char *argv[])

while(1)

// 循环打印,总有缓冲区填满的可能

printf(“hello sunplusedu”);

while(1);

return 0;

3.2 人为刷新缓冲区

#include 《stdio.h》

int main(int argc, char *argv[])

printf(“hello test”);

fflush(stdout);// 人为刷新

while(1);

return 0;

3.3 程序正常结束

#include 《stdio.h》

int main(int argc, char *argv[])

printf(“hello sunplusedu”);

return 0;

// 程序正常结束

4. 不带缓冲区

#include 《unistd.h》

#include 《string.h》

int main(int argc, char *argv[])

char *str = “hello test”;

// 有没有

,缓冲区有没有填满,都没关系

write(1, str, strlen(str));// 往标准输出写内容

while(1);

return 0;

Linux系统调用中的IO函数一般不带有缓冲区。
责任编辑:pj

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 缓冲
    +关注

    关注

    0

    文章

    53

    浏览量

    18175
  • Linux系统
    +关注

    关注

    4

    文章

    609

    浏览量

    29629
  • 程序
    +关注

    关注

    117

    文章

    3836

    浏览量

    84745
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-文件I/O的深入学习之异步I/O

    I/O多路复用中,进程通过系统调用select或poll来主动查询文件描述符上是否可以执行I/O操作
    发表于 12-05 11:23

    飞凌嵌入式ElfBoard-文件I/O的深入学习之I/O多路复用

    I/O多路复用(IO multiplexing)通过一种机制,可以监视多个文件描述符,一旦某个文件描述符(也就是某个文件)可以执行I/O
    发表于 12-05 11:18

    飞凌嵌入式ElfBoard-文件I/O的深入学习之阻塞I/O与非阻塞I/O

    1.4.1.1 概念 阻塞I/O顾名思义就是对文件的I/O操作是阻塞式的,即假如对某些类型文件(管道文件、网络设备文件和字符设备文件)进行读
    发表于 12-01 13:07

    飞凌嵌入式ElfBoard-文件I/O的了解探究之I/O缓冲

    通过标准I/O操作磁盘文件时,为了减少系统调用的次数,标准I/
    发表于 11-19 16:24

    浅谈光学I/O模块的热挑战

    服务器和机架式网络基础设施系统内的光学 I/O 模块通常接受主动冷却系统的直接冷却,特别是来自机架式设备前面板的强制风冷。机架式设备的散热设计需要平衡 I/O 模块的热管理与处理器或
    的头像 发表于 11-03 09:32 428次阅读
    浅谈光学<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模块的热挑战

    如何解决I/O时钟布局器错误

    I/O 时钟布局器阶段可能会发生错误,指出该工具无法对该时钟结构进行布局,直至最后 BUFG 仍然无法完成布局。
    的头像 发表于 09-23 16:05 583次阅读

    TCA9536 4位I2C/SMBus I/O扩展器技术解析

    Texas Instruments TCA9536 4位I/O扩展器用于I^2^C总线,可在1.65V至 5.5V的V~CC~ 下运行。它可通过I^2^C接口为大多数微控制器系列提供通
    的头像 发表于 09-19 14:45 480次阅读
    TCA9536 4位<b class='flag-5'>I</b>2C/SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器技术解析

    TCA9537远程4位I²C/SMBus I/O扩展器技术解析与应用指南

    Texas Instruments TCA9537远程4位I^2^C和SMBus I/O扩展器在1.65V至5.5V V~CC~电压下运行,可通过I²C接口实现通用远程
    的头像 发表于 09-15 16:00 639次阅读
    TCA9537远程4位<b class='flag-5'>I</b>²C/SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器技术解析与应用指南

    TCAL9539 I2C总线I/O扩展器技术解析与应用指南

    Texas Instrument TCAL9539/TCAL9539-Q1 I^2^C总线/SMBus I/O扩展器为双线双向I^2^C总线(或SMBus)协议提供通用并行输入/输出
    的头像 发表于 08-08 11:49 921次阅读
    TCAL9539 <b class='flag-5'>I</b>2C总线<b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器技术解析与应用指南

    I/O密集型任务开发指导

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行
    发表于 06-19 07:19

    MAX7325 I²C端口扩展器,提供8路推挽式I/O和8个漏极开路I/O技术手册

    MAX7325 2线串行接口外设具有16路I/O端口。其中8路为推挽输出,另外8路为I/O端口,带有可选择的内部上拉和瞬态检测功能。8路I/
    的头像 发表于 05-22 15:27 668次阅读
    MAX7325 <b class='flag-5'>I</b>²C端口扩展器,提供8路推挽式<b class='flag-5'>I</b>/<b class='flag-5'>O</b>和8个漏极开路<b class='flag-5'>I</b>/<b class='flag-5'>O</b>技术手册

    ADP5588移动I/O扩展器和QWERTY键盘控制器技术手册

    ADP5588是一款I/O端口扩展器和键盘矩阵,适用于需要大型键盘矩阵和扩展I/O线路的QWERTY型电话。I/
    的头像 发表于 05-22 11:37 676次阅读
    ADP5588移动<b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器和QWERTY键盘控制器技术手册

    怎样使用无线 I/O 网关搭建物联网系统

    、智慧城市等。    ● 根据应用场景确定需要监测和控制的具体设备及其参数。 2. 设备兼容性:    ● 确定网关需要支持的设备类型、通信协议和接口。    ● 确保无线I/O网关能够与现场的传感器、执行器等设备兼容。 二、选
    的头像 发表于 04-13 07:35 754次阅读
    怎样使用无线 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 网关搭建物联网系统

    I/O接口与I/O端口的区别

    在计算机系统中,I/O接口与I/O端口是实现CPU与外部设备数据交换的关键组件,它们在功能、结构、作用及运作机制上均存在显著差异,却又相互协同工作,共同构建起CPU与外部设备之间的桥梁
    的头像 发表于 02-02 16:00 2787次阅读

    单片机I/O接口的传输方式

    单片机(Microcontroller Unit,MCU)作为嵌入式系统的核心部件,其输入输出(Input/Output,I/O)接口是实现与外部设备数据交换的关键。I/O接口不仅承担
    的头像 发表于 02-02 15:56 1630次阅读