UNIX环境高级编程——标准I/O库
对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,它们是:标准输入、标准输出、和标准错误。
标准I/O库提供缓冲的目的是尽可能减少使用read和write的次数。
标准I/O库提供了三种类型的缓冲:
(1)全缓冲:在填满标准I/O缓冲区后进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在标准I/O库方
面,flush(冲洗)意味着将缓冲区中的内容写到磁盘上。在终端驱动程序方面,flush(刷清)表示丢弃已储存在缓冲区中的数据。
(2)行缓冲:当输入或输出遇到换行符时,标准I/O库执行I/O操作。
(3)不带缓冲:标准I/O库不对字符进行缓冲储存。
标准出错stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来。
一、函数fopen
函数功能:打开一个文件
函数原型:FILE * fopen(const char * path,const char * mode);
返回值: 文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
使用字符b作为type的一部分,则使得标准I/O系统可以区分文本文件和二进制文件。因为UNIX内核并不对这两种文件区分,所以在UNIX环境下指定字符b作为type的一部分实际上并无作用。
除非流引用终端设备,否则按系统默认情况,流被打开时是全缓冲的。若流引用终端设备,则该流是行缓冲的。
二、fclose函数
函数功能:关闭一个打开的流
函数原型:int fclose(FILE* fp);
在该文件被关闭之前,冲洗缓冲区中的输出数据。丢弃缓冲区中的任何输入数据。
当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓冲数据的标准I/O流都会被冲洗,所有打开的标准I/O流自动关闭。
三、读和写流
一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读、和写操作:
(1)每次一个字符的I/O。一次读或写一个字符,如果流是带缓冲的,则标准I/O函数会处理所有缓冲。
(2)每次一行的I/O。如果想一次读或写一行,则使用fgets和fputs。每行都以换行符终止。
(3)直接I/O。fread和fwrite函数支持这种类型的I/O。
1.输入函数(一次读一个字符)
以下三个函数可用于一次读一个字符
int getc(FILE* fp);
int fgetc(FILE *FP);
int getchar(void);
返回值:若成功则返回下一个字符,若已到达文件结尾或出错则返回EOF。
函数getchar等价于getc(stdin)。
这三个函数在返回下一个字符时,会将其unsigned char类型转换为int类型。在<stdio.h>中的常量EOF被要求是一个负数,其实经
常是-1。
注意,不管是出错还是到达文件结尾,这三个函数都返回同样的值(EOF)。为了区分这两种不同的情况,必须调用ferror或feof。
int ferror(FILE* fp);
int feof(FILE* fp);
两个函数返回值:若条件为真则返回非0值,否则返回0.
void clearerr(FILE* fp);
在大多数实现中,为每个流在FILE对象中维持了两个标志:
(1)出错标志
(2)文件结束标志
调用clearerr函数则清除这两个标志。
2.输出函数(一次输出一个字符)
int putc(int c,FILE *fp);
int fpuc(int c,FILE *fp);
int putchar(int c);
putchar(c)等效于putc(c,stdout)
3.每次一行I/O
char *fgets(char* buf,int n,FILE* fp);
char *gets(char* buf);
对于fgets,必须指定缓冲区的长度n。此函数一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符被送入缓冲区。该缓冲区以null字符结尾。
int fputs(char* str,FILE* fp);
int puts(char* str);
4.二进制I/O
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
功 能:从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功
返回 0。
参 数:
buffer 用于接收数据的内存地址,大小至少是size*count字节.
size 单个元素的大小,单位是字节
count 元素的个数,每个元素是size字节.
stream 输入流
返回值:实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误.从ferror和feof获取错误信息或检测是否到达文件结尾.
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要输出数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
四、定位流
函数原型: long ftell(FILE* fp);
函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。
函数原型: int fseek(FILE *stream, long offset, int where);
函数功能:重定位流(数据流/文件)上的文件内部位置指针
注意:不是定位文件指针,文件指针指向文件/流。位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。
函数设置文件指针stream的位置。如果执行成功,stream将指向以where(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
函数原型:void rewind(FILE *stream);
功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头
注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);
UNIX环境高级编程——标准I/O库的更多相关文章
- UNIX环境高级编程---标准I/O库
前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...
- UNIX环境高级编程——标准I/O库缓冲区和内核缓冲区的区别
1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘.显示器.串口.磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可 ...
- UNIX环境高级编程 标准IO库
标准I/O库处理很多细节,使得便于用户使用. 流和 FILE 对象 对于标准I/O库,操作是围绕 流(stream)进行的.当用标准I/O打开或创建一个文件时,我们已使一个流与一个文件相关联. 对于A ...
- UNIX环境高级编程——标准I/O库函数和Unbuffered I/O函数
以写文件为例,C标准I/O库函数(printf(3) .putchar(3) .fputs(3) )与系统调用write(2) 的关 系如下图所示. 库函数与系统调用的层次关系 open .read ...
- UNIX环境高级编程——标准IO-实现查看所有用户
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h&g ...
- (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- 判断是否是IE9浏览器的最短语句 var ie=!-[1,]
没错,上面这个语句就可以判断浏览器是不是IE9以下的.why?1.[1,]在现代浏览器(ie包括ie9及以上)会被转换成[1], 而ie9以下就会转换成[1,undefined].2.分别对[1],和 ...
- Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013
折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...
- 使用gogs搭建git私有仓库
搭建gogs 我的机器环境:centos 7 1.安装git yum install git 2.安装mysql gogs的数据存在mysql中,需要安装一个mysql来存数据,当然也有其他的选择 ...
- AC的故事大结局山寨版(下)(最大流)
福建工程学院第十二届ACM程序设计大赛真题 AC的故事大结局山寨版(下) TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%l ...
- SQL_CALC_FOUND_ROWS equivalent in PostgreSQL
https://www.postgresql.org/message-id/1185863074.10580.91.camel%40linda.lfix.co.uk On Tue, 2007-07-3 ...
- Android动态修改ToolBar的Menu菜单
Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了. 开始上货 Menu Me ...
- 使用DB查询分析器实现异构数据源中数据表的相互访问
1 引言 硕士程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本<DB Query A ...
- 20160219.CCPP体系详解(0029天)
程序片段(01):ReplaceAll.c 内容概要:ReplaceAll #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #incl ...
- Java多线程的调度策略
在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权. ...
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做? 分析: "假设两个整数数组为A和B,各有N个元素,任意两个数的和组成的数组C有N^2个元素. ...