`

学习标准IO需要注意的几个问题

阅读更多

一、注意缓冲类型:全缓冲、行缓冲和不带缓冲。

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可以检测到底是出错了还是达到文件末尾了。

0
1
分享到:
评论

相关推荐

    超爽的自学课件(java)

    对构建器的定义要涉及函数过载的概念(因为可能同时有几个构建器)。随后要讨论的是清除过程,它并非肯定如想象的那么简单。用完一个对象后,通常可以不必管它,垃圾收集器会自动介入,释放由它占据的内存。这里详细...

    入门学习Linux常用必会60个命令实例详解doc/txt

    建议在/mnt里建几个/mnt/cdrom、/mnt/floppy、/mnt/mo等目录,当作目录的专用挂载点。举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设都是Linux的ext2系统,如果是Windows XX请将ext2改成vfat): 软盘 ==...

    DOS 软盘+光盘+U盘+硬盘+NTFS 想拥有更强大的DOS功能??

    我不是DOS高手(绝非nnmm谦虚),考虑到通用性、兼容性、方便大家学习,我制作的这些启动盘也不是全功能的完美作品,我只是想让“菜鸟”朋友们通过这些启动盘来了解DOS,学习DOS,把它做为学习DOS的一个契机。...

    net学习笔记及其他代码应用

    创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 38.abstract class和interface有什么区别? 答: 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于...

    jpivot学习总结.doc

    这个逻辑模型实际上提供了这几个概念: Cubes (立方体)、维度( Dimensions )、层次( Hierarchies )、级别( Levels )、和成员( Members )。而一个 schema 文件就是编辑这个 schema 的一个 xml 文件。在这个...

    整理后java开发全套达内学习笔记(含练习)

    以“%”开头,[第几个数值$][flags][宽度][.精确度][格式] printf()的引入是为了照顾c语言程序员的感情需要 格式化输出 Formatter;格式化输入 Scanner;正则表达式 输出格式控制: 转义符: \ddd 1到3位8...

    一个进程池的服务器程序

    一个进程池的服务器程序 下面做了非常简单的http服务器,该服务器只能接收Get请求。 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子...

    c语言编写单片机技巧

    答:在设计高频电路用电路板有许多注意事项,尤其是GHz等级的高频电路,更需要注意各电子组件pad与印刷pattern的长度对电路特性所造成的影响。最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统...

    传智播客扫地僧视频讲义源码

    20_信息系统框架集成第三方产品案例_几个重要的面向对象思想_传智扫地僧 21_作业 文档和源码 01_上一次课程回顾 02_数组指针语法梳理 03_函数指针语法梳理_传智扫地僧 04_函数指针做函数参数思想剖析_传智扫地僧 05_...

    Windows驱动开发技术详解的光盘-part1

    同时,还需要区分物理内存地址和虚拟内存地址这两个概念。  5.1 内存管理概念  5.1.1 物理内存概念(Physical Memory Address)  5.1.2 虚拟内存地址概念(Virtual Memory Address)  5.1.3 用户模式地址和...

    windows驱动开发技术详解-part2

    同时,还需要区分物理内存地址和虚拟内存地址这两个概念。  5.1 内存管理概念  5.1.1 物理内存概念(Physical Memory Address)  5.1.2 虚拟内存地址概念(Virtual Memory Address)  5.1.3 用户模式地址和...

    JSTL详细标签库介绍

    在类库中出现每一个异常,都需要一个惟一错误处理,在类库中使用异常处理很合适&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;16.3 其他的错误处理技术:&lt;BR&gt;&lt;BR&gt;处理异常的方法:&lt;BR&gt;1、 在程序可以忽略异常(忽略异常在大型公用软件和关键处理...

    Java经典入门教程pdf完整版

    在这两个阶段屮,需要我们去完成的就是编译阶段的工作,也就是说:我们需要把我们 想要札器完成的工作用Jaa语言表达出来,写成Java源文件,然后把源文件进行编译,形 成 class文件,最后就可以在JaⅦa运行环境中运行了。...

    基于AT89S52 单片的频率计

    的,所以我们可以把系统分为以下几个模块:数据处理电路、显示电路、待测信 号产生电路、待测信号整形放大电路,电源电路。 2.2 主要开发工具和平台 2.2.1 原理图和印刷电路板图设计开发工具:PROTEL DXP Protel DXP...

Global site tag (gtag.js) - Google Analytics