本章讲述标准I/O库

流和FILE对象

对于标准I/O库,它们的操作是围绕流进行的。流的定向决定了所读、写的字符是单字节还是多字节的。

#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp,int mode);

fwide函数可用于流的定向。根据mode参数的不同值,fwide函数执行不同的工作

若mode参数值为负,fwide将试图使指定的流是字节定向的

若mode参数值为正,fwide将试图使指定的流是宽定向的

若mode参数值是0,fwide将不试图设置流的定向,但返回标志该流定向的值

当一个流最初被创建时,它并没有定向。若在未定向的流上使用一个多字节(单字节)I/O函数,则将该流设置为宽(字节)定向。fwide并不改变已定向流的定向。

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

对一个进程预定义了3个流:stdin、stdout、stderr。

缓冲

标准I/O提供了以下3种类型的缓冲

1 全缓冲,在这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。如磁盘上的文件通常实施全缓冲。

2 行缓冲,在这种情况下,当在输入和输出中遇到换行符,标准I/O执行I/O操作。如标准输入输出。

3 不带缓冲,标准I/O库不对字符进行缓冲存储。标准错误流stderr通常是不带缓冲的。

我们可以调用下面两个函数更改缓冲类型

#include <stdio.h>
void setbuf(FILE *restrict fp,char *restrict buf);
int setvbuf(FILE *restrict fp,char *buf,int mode,size_t size);

可以使用setbuf打开或关闭缓冲机制,参数buf指定一个长度为BUFSIZ的缓冲区。将buf设置为NULL可以关闭缓冲。

使用setvbuf,我们可以精确地说明所需的缓冲类型。这是用mode参数实现的:

_IOFBF  全缓冲

_IOLBF  行缓冲

_IONBF  不带缓冲

我们可以通过fflush函数冲洗一个流

#include <stdio.h>
int fflush(FILE *fp);

打开流

下面3个函数打开一个标准I/O流

#include <stdio.h>
FILE *fopen(const char *restrict pathname,const char *restrict type);
FILE *freopen(const char *restrict pathname,const char *restrict type,FILE *restrict fp);
FILE *fdopen(int fd,const char *type);

type参数指定对该I/O流的读、写方式,ISO C规定type参数可以有如下15种不同的值

其中b作为type的一部分,这使得标准I/O系统可以区分文本文件和二进制文件

调用fclose关闭一个打开的流

#include <stdio.h>
int fclose(FILE *fp);

读和写流

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

#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void); //等同于getc(stdin)

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

#include <stdio.h>
int putc(int c,FILE *fp);
int fputc(int c,FILE *fp);
int putchar(int c);

每次一行I/O

下面两个函数提供每次输入一行的功能

#include <stdio.h>
char *fgets(char *restrict buf,int n,FILE *restrict fp); //buf为缓冲区地址,读入的行将送入其中,参数n指定缓冲的长度
char *gets(char *buf); //不推荐使用

fputs和puts提供每次输出一行的功能

#include <stdio.h>
int fputs(const char *restrict str,FILE *restrict fp);
int puts(const char *str);

二进制I/O

下列两个函数执行二进制I/O操作

#include <stdio.h>
size_t fread(void *restrict ptr,size_t size,size_t nobj,FILE *restrict fp);
size_t fwrite(const void *restrict ptr,size_t size,size_t nobj,FILE *restrict fp);

参数size为欲写结构的长度,nobj为欲写的元素个数,函数返回的是读或写的对象数。这些函数有以下两种常见的用法

float data[];
if(fwrite(&data[],sizeof(float),,fp)!=)
err_sys("fwrite error");
//读写一个结构
struct{
short count;
long total;
char name[NAMESIZE];
}item; if(fwrite(&item,sizeof(item),,fp)!=)
err_sys("fwrite error");

定位流

有3种方法定位标准I/O流

#include <stdio.h>
long ftell(FILE *fp); //若成功,则返回当前文件位置指示,出错则返回-lL
int fseek(FILE *fp,long offset,int whence);
void rewind(FILE *fp);

除了偏移量的类型是off_t而非long以外,ftello函数与ftell相同,fseeko函数与fseek相同

#include <stdio.h>
off_t ftello(FILE *fp);
int fseeko(FILE *fp,off_t offset,int whence);

下面函数是ISO C标准引入的

#include <stdio.h>
int fgetpos(FILE *restrict fp,fpos_t *restrict pos);
int fsetpos(FILE *fp,const fpos_t *pos);

格式化I/O

格式化输出是由printf函数处理的

#include <stdio.h>
int printf(const char *restrict format,...);
int fprintf(FILE *restrict fp,const char *restrict format,...);
int dprintf(int fd,const char *restrict format,...); int sprintf(char *restrict buf,const char *restrict format,...);
int snprintf(char *restrict buf,size_t n,const char *restrict format,...); //参数n指定缓冲区长度

执行格式化输入处理的是3个scanf函数

#include <stdio.h>
int scanf(const char *restrict format,...);
int fscanf(FILE *restrict fp,const char *restrict format,...);
int sscanf(const char *restrict buf,const char *restrict format,...);

临时文件

ISO C标准I/O库提供了两个函数以帮助创建临时文件

#include <stdio.h>
char *tmpnam(char *ptr);
FILE *tmpfile(void);

tmpnam函数产生一个与现有文件名不同的一个有效路径名字符串

tmpfile创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除。

apue学习笔记(第五章 标准I/O)的更多相关文章

  1. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  2. [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像

    [HeadFrist-HTMLCSS学习笔记]第五章认识媒体:给网页添加图像 干货 JPEG.PNG.GIF有何不同 JPEG适合连续色调图像,如照片:不支持透明度:不支持动画:有损格式 PNG适合单 ...

  3. 【马克-to-win】学习笔记—— 第五章 异常Exception

    第五章 异常Exception [学习笔记] [参考:JDK中文(类 Exception)] java.lang.Object java.lang.Throwable java.lang.Except ...

  4. 学习笔记 第五章 使用CSS美化网页文本

    第五章   使用CSS美化网页文本 学习重点 定义字体类型.大小.颜色等字体样式: 设计文本样式,如对齐.行高.间距等: 能够灵活设计美观.实用的网页正文版式. 5.1 字体样式 5.1.1 定义字体 ...

  5. 《Spring实战》学习笔记-第五章:构建Spring web应用

    之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. ...

  6. opencv图像处理基础 (《OpenCV编程入门--毛星云》学习笔记一---五章)

    #include <QCoreApplication> #include <opencv2/core/core.hpp> #include <opencv2/highgu ...

  7. [汇编学习笔记][第五章[BX]和loop指令]

    第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...

  8. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

  9. Linux学习笔记(第五章)

    第五章-常用指令 下达指令: 1.[Tab] 2.man + (指令):显示操作说明 开头代号 man page 常用按键

  10. o'Reill的SVG精髓(第二版)学习笔记——第五章

    第五章 文档结构 5.1 结构与表现 XML的目标之一便是提供一种能将结构从视觉表示中独立出来的方法. 但是不幸的是,关于XML的很多讨论都强调结构而非表现. 我们将通过详细讨论如何在SVG中指定表现 ...

随机推荐

  1. Mysql InnoDB事务

    http://www.cnblogs.com/benshan/archive/2013/01/19/2867244.html 事务的四个特性 1.原子性(atomicity)原子性是指整个数据库事务是 ...

  2. iOS-@inerface的11条规范写法

    总结一些interface声明时的规范,相关宏的介绍,定义方法时有用的修饰符,编写注释的规范,最终写出一个合格的头文件. 1.读写权限 1.1实例变量的@public,@protected,@priv ...

  3. [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)

    A - ACM Computer Factory 题目描述:某个工厂可以利用P个部件做一台电脑,有N个加工用的机器,但是每一个机器需要特定的部分才能加工,给你P与N,然后是N行描述机器的最大同时加工数 ...

  4. Hall 定理

    Hall 定理 是匈牙利算法的基础 大意是说,对于一个二分图 左边的集合记为X,右边的集合记为Y 存在完美匹配,(即匹配数目=min(|X|,|Y|))的充分必要条件是 对于任意一个X的子集,设大小为 ...

  5. 3973: seq

    3973: seq 题目描述 小y 的男朋友送给小y 一个数列{ai}{ai},并且刁难小y 要她维护这个序列. 具体而言,小y 的男朋友要求小y 完成两个操作: 1. 修改数列中的一个数 2. 设p ...

  6. iOS飘雪的动画小demo

    ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController{ UIImage ...

  7. MongoDB 查询语法

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册:http://www.mongodb.org/di ...

  8. 百度识图for windows phone 上线

    原文发布时间为:2013-07-04 -- 来源于本人的百度文章 [由搬家工具导入] 百度识图主要用于找女神,找男神,找美图,找宠物,找图文新闻,找相似图,找原图,还能鉴别头像照片真伪,免得被网络照片 ...

  9. 【eclipse】导入/导出开发环境(包括编辑器字体颜色大小等)

    Eclipse的 File -> Export(导出),在窗口中展开 General(常规) -> Perferences(首选项)-->Export all(全部导出)然后点击 N ...

  10. 在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】

    转自:http://www.cnblogs.com/chaojihexiang/p/6417835.html 微软的vscode编辑器是一个好东西,通过vscode编辑python程序非常的方便.推荐 ...