一、注意缓冲类型:全缓冲、行缓冲和不带缓冲。
1.标准出错流stderr通常是不带缓冲的。
2.涉及终端设备的流,比如stdin,一般是行缓冲的。
3.其它情况都是全缓冲。
可以更改缓冲类型,通过setbuf和setvbuf函数。
可以通过fflush冲洗输出流缓冲区,即将缓冲区内容写入文件中。
fflush参数传递NULL时,表示将冲洗所有输出流。
程序正常结束的时候,会冲洗缓冲区的输出数据,丢弃缓冲区的输入数据,并关闭所有打开的标准I/O流。
二、标准I/O函数采取了最优读写性能时的buf大小BUFSIZE,UNIX中一般定义为stat结构成员中st_blksize所指定的值。
三、读、写流函数分三类:每次一个字符、每次一行、直接I/O。
分别为:
1.getc, fgetc, getchar; putc, fputc, putchar
2.gets, fgets; puts, fputs
3.fread; fwrite;
注意:
getchar、getc、fgetc返回值都是int型的(目的是将出错返回也包括进来)。
putc、fputc、putchar返回值也是int型。
gets不对要写入的缓冲区进行检测,需要程序员确保写入内容不会超过缓冲区大小。如char str[2]; gets(str);当输入hello,即产生缓冲区溢出问题。
[canlynet@dc ~]$ cat test.c
#include <stdio.h>
int main(void)
{
char str[2];
char buf[2];
gets(str);
puts(str);
puts(buf);
return 0;
}
[canlynet@dc ~]$ gcc -o test test.c
/tmp/ccSY7eFA.o: In function `main':
test.c:(.text+0x11): warning: the `gets' function is dangerous and should not be used.
[canlynet@dc ~]$ ./test
hello
hello
��hello
[canlynet@dc ~]$
gets并不将换行符存入缓冲区中,fgets却会。
puts会添加一个换行符,fputs不会。
标准I/O函数读取文件时,无论出错还是达到文件尾,都返回负值-1(宏定义为EOF),但是流的FILE对象中维持了两个标志用于区分,采用函数ferror和feof可以检测到底是出错了还是达到文件末尾了。
分享到:
相关推荐
在进行二进制IO操作时,有几个关键点需要注意: 1. **数据对齐**:不同的硬件平台可能对数据存储有不同的字节对齐规则,确保在读写时遵循这些规则,避免因对齐问题导致的数据混乱。 2. **错误处理**:总是检查文件流...
3. **编码问题**:使用字符流时要注意指定正确的字符编码,以防止乱码问题。 4. **性能优化**:合理使用缓冲流(`BufferedReader`, `BufferedWriter`, `BufferedInputStream`, `BufferedOutputStream`)可以显著提高...
需要注意的是,由于操作系统对进程的调度顺序未知,因此无法预测最终的输出顺序。但是,可以确定的是,所有进程都会执行`printf("Hello World!\n");`这一行,因此会输出七次"Hello World!"。 ### 总结 通过今天的...
需要注意的是,RapidIO规范的版权和使用条款表明其在提供技术标准的同时,没有对使用这些标准所开发的产品提供任何形式的保证。用户在实施和使用RapidIO规范时,必须自行承担与之相关的风险,包括但不限于知识产权...
手册的主要内容可以分为以下几个关键知识点: 1. **技术参数**:这部分通常会介绍堡盟IO LINK设备的具体规格,包括电源电压、工作电流、传输速率、最大电缆长度、防护等级等。这些参数对于正确选择和配置设备至关...
编写FC11和FC12的步骤通常包括以下几个部分: 1. **配置网络**:在TIA Portal中,首先需要配置PLC的网络接口,设定PROFINET IO控制器和IO设备的拓扑结构。每个IO设备应有明确的设备名称和地址。 2. **创建设备数据...
**正文** Swift Card.IO-iOS-SDK是一款专为iOS开发者设计的开源库,它使得在移动应用中集成信用卡扫描功能变得快速且简单。...在进行集成时,务必注意遵循相关的安全标准和用户隐私政策,以确保应用的合规性和可靠性。
在实现过程中,我们需要注意几个关键点: 1. 类必须实现Serializable接口,否则Java不会允许序列化。 2. 需要谨慎处理静态字段,因为它们不会随着对象一起序列化。 3. 反序列化时,确保类的定义与序列化时的版本一致...
在draw.io-note-master这个压缩包中,可能包含了使用draw.io绘制的各种UML图示例,你可以参考这些例子学习和实践。通过不断练习,你将能够熟练地运用draw.io绘制出专业且实用的UML图,提升你的软件设计能力。
开发基于此协议栈的应用,开发者需要注意以下几点: 1. **理解CIP**:虽然库封装了CIP,但深入理解其结构和工作原理对于优化通信效率和解决故障至关重要。 2. **设备发现**:利用协议栈实现设备的自动发现和在线...
本压缩包“适合于初学者的java小程序之1”包含了几个简单的Java程序示例,旨在帮助新手理解基本的编程概念和Java语言的特性。 首先,我们要讨论的是递归。递归是编程中的一个重要概念,它是指函数或方法在执行过程...
- 了解Java的基本语法:Java包含了五十多个关键词和几十个运算符,学习这些基础知识是必要的。熟悉关键字、运算符以及Java的语法规则,能够帮助你编写简单的Java程序。 - 掌握面向对象编程:理解类、对象、继承、...
在这个"CPlusPlusNote.github.io"项目中,我们可以看到一系列关于C++编程的注意事项,这些提示和技巧对于任何想要深入学习或提高C++编程技能的人来说都是宝贵的资源。 在C++编程中,有几个关键的知识点是必须要掌握...
检测程序一般会包括以下几个部分: 1. **硬件检测**:检查板卡是否正确安装并被操作系统识别,确认PCI插槽工作正常。 2. **功能测试**:验证板卡的各项功能,如数字I/O的开关测试,模拟I/O的精度测试,计数器/...
为解决这个问题,可以重写`VerifyRenderingInServerForm`方法,不强制验证控件是否在form内。 此外,还有其他导出方法,例如使用Microsoft Office Interop库直接创建Excel文件,或者使用第三方库如EPPlus、NPOI等,...
C++标准库主要分为以下几个部分: 1. **IO流库**:`<iostream>`、`<fstream>`等头文件提供了输入输出流的处理,如cin、cout用于控制台输入输出,fstream用于文件操作。 2. **容器库**:包括向量(`std::vector`)...
Go语言的基础入门知识通常涵盖以下几个方面: 1. Go语言的基本语法,包括变量的声明和类型、基本运算符、控制结构等。 2. 数据结构,如数组、切片(slices)、字典(maps)等在Go中的使用和特点。 3. 函数的定义、...
在逆向工程SCSS时,我们可能会遇到以下几个关键点: 1. **变量解析**:逆向工程SCSS时,识别和理解变量的使用至关重要。变量让CSS代码具有更强的复用性和可维护性,它们可以存储颜色、尺寸、字体等样式属性,逆向时...
从C++过渡到Java,开发者需要注意以下几个关键点,以便更好地适应纯面向对象的Java编程。 1. **内存管理与垃圾回收** 在C++中,程序员需要手动进行内存分配和释放,而Java则采用了自动垃圾回收机制。Java的垃圾...
在AVR上编程实现DS18B20通信主要包括以下几个步骤: 1. 初始化IO口:将与DS18B20连接的IO口设置为输入/输出模式,以及适当的中断和方向控制。 2. 发送命令:通过单线通信协议发送读取温度、启动温度转换等命令。 3. ...