5.6 读和写流

5.6 读和写流

5.6 读和写流

一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读、写操作。

(1) 每次一个字符I / O。一次读或写一个字符,如果流是带缓存的,则标准I / O函数处理所有缓存。

(2) 每次一行I / O。使用fgetsfputs一次读或写一行。每行都以一个新行符终止。当调用fgets时,应说明能处理的最大行长。

(3) 直接I / Ofreadfwrite函数支持这种类型的I / O。每次I / O操作读或写某种数量的对象,而每个对象具有指定的长度。这两个函数常用于从二进制文件中读或写一个结构

5.6.1 输入函数

以下三个函数可用于一次读一个字符:

#include<stdio.h>

int getc( FILE* fp);

int fgetc(FILE*fp);

int getchar( void); //equal to getc(stdin);

前两个函数的区别在于getc可被实现为宏,而fgetc则不能实现为宏。这意味着:

(1) getc的参数不应当是具有副作用的表达式。

(2) 因为fgetc一定是个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。

(3) 调用fgetc所需时间很可能长于调用getc,因为调用函数通常所需的时间长于调用宏。检验一下<stdio.h>头文件的大多数实现,从中可见getc是一个宏,其编码具有较高的工作效率。

这三个函数unsigned char 类型转换为int的方式返回下一个字符。说明为不带符号的理由是,如果最高位为1也不会使返回值为负。要求整型返回值的理由是,这样就可以返回所有可能的字符值再加上一个已发生错误或已到达文件尾端的指示值。在<stdio.h>中的常数EOF被要求是一个负值,其值经常是-1。这就意味着不能将这三个函数的返回值存放在一个字符变量中,以后还要将这些函数的返回值与常数EOF相比较。

注意,不管是出错还是到达文件尾端,这三个函数都返回同样的值。为了区分这两种不同的情况,必须调用ferrorfeof

#include<stdio.h>

int ferror( FILE*fp);

int feof( FILE*fp);

void clearerr( FILE*fp);

前两个函数返回值:若条件为真,则返回非0值;否则返回0

在大多数实现的FILE对象中,为每个流保持了两个标志:

l  出错标志。

l  文件结束标志。

调用clearerr则清除这两个标志。

从一个流读之后,可以调用ungetc将字符再送回流中。

#include<stdio.h>

int ungetc( int c, FILE*fp);

成功则返回c,失败则返回EOF

送回到流中的字符以后又可从流中读出,但读出字符的顺序与送回的顺序相反。应当了解,虽然ANSI C允许支持任何数量的字符回送的实现,但是它要求任何一种实现都要支持一个字符的回送功能。

回送的字符,不一定必须是上一次读到的字符。EOF不能回送。但是当已经到达文件尾端时,仍可以回送一字符。下次读将返回该字符,再次读则返回EOF。之所以能这样做的原因是一次成功的ungetc调用会清除该流的文件结束指示。

当正在读一个输入流,并进行某种形式的分字或分记号操作时,会经常用到回送字符操作。有时需要先看一看下一个字符,以决定如何处理当前字符。然后就需要方便地将刚查看的字符送回,以便下一次调用getc时返回该字符。如果标准I / O库不提供回送能力,就需将该字符存放到一个我们自己的变量中,并设置一个标志以便判别在下一次需要一个字符时是调用getc,还是从我们自己的变量中取用。

5.6.2 输出函数

对应于上面所述的每个输入函数都有一个输出函数。

#include <stdio.h>

int putc(int c, FILE*fp);

int fputc(int c,FILE*fp);

int putchar(int c);

三个函数返回值:成功返回c;失败返回EOF.

与输入函数一样,putchar(c) 等同于putc(c, stdout)putc 可被实现为宏,而fputc 则不能实现为宏。

转载于:https://www.cnblogs.com/shaoguangleo/archive/2011/10/08/2805982.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110545.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • setrequestproperty()怎么使用_url主要功能

    setrequestproperty()怎么使用_url主要功能设置头信息的,比如格式,UA等,不设置自然有默认的,一般的请求倒不需要去设置,可以去看看android里的DefaultHttpClient里也有设置头信息的setRequestProperty 主要是用来设置下面的功能Javacode?12connection.setRequestProperty(“Con

    2025年9月11日
    7
  • idea 2022.01.21 激活码【2022免费激活】2022.02.26「建议收藏」

    (idea 2022.01.21 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~2KLKA7BQFO-eyJsaWNlbnNlSWQiOi…

    2022年4月1日
    97
  • 0x00000000代码电脑蓝屏的原因_计算机0x是什么意思

    0x00000000代码电脑蓝屏的原因_计算机0x是什么意思在我们平时工作使用电脑的过程中难免会遇到各种各样的问题,有些电脑的故障,可以轻松解决,而有些问题就连重装系统都不一定解决的了,例如电脑蓝屏,而电脑蓝屏代码0x000000BE又是怎么回事呢?又该怎么解决呢?莫慌,小编这就将解决电脑蓝屏代码0x000000BE的方法告诉大家。相信遇到过蓝屏的用户都知道,当蓝屏出现时,Windows操作系统的蓝屏死机提示已经成为标志性的画面,大部分是系统崩溃的现象,令…

    2022年10月8日
    5
  • 微服务架构-实现技术之六大基础组件:服务通信+事件驱动+负载均衡+服务路由+API网关+配置管理

    微服务架构-实现技术之六大基础组件:服务通信+事件驱动+负载均衡+服务路由+API网关+配置管理微服务架构的实现首先需要提供一些基础组件,这些基础的功能性组件主要包括服务之间的通信、面向事件驱动的架构设计方法、负载均衡、服务路由、API网关和分布式配置中心等,我们对这六大基本组件进行初步的分析定案。一、服务通信:网络连接+IO模型+可靠性+同步与异步对于微服务而言,网络通信主要关注于网络连接、IO模型、可靠性设计及服务调用方式。1.网络连接一般,基于TCP网络连接有两种基本方…

    2022年4月27日
    72
  • android toast用法_android五种布局的特点

    android toast用法_android五种布局的特点Toast用于向用户显示一些帮助/提示。下面我做了5中效果,来说明Toast的强大,定义一个属于你自己的Toast。1.默认效果代码Toast.makeText(getApplicationContext(),"默认Toast样式",     Toast.LENGTH_SHORT).show(); 2.自定义显示位置效果代码toast=Toast.mak…

    2025年11月2日
    4
  • 部署、收回和删除解决方式—-STSADM和PowerShell「建议收藏」

    部署、收回和删除解决方式—-STSADM和PowerShell

    2022年1月21日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号