博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX环境高级编程——标准I/O库
阅读量:5169 次
发布时间:2019-06-13

本文共 2948 字,大约阅读时间需要 9 分钟。

    对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,它们是:标准输入、标准输出、和标准错误。

    标准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);

转载于:https://www.cnblogs.com/wangfengju/p/6172841.html

你可能感兴趣的文章
ubuntu 包管理
查看>>
java -io字符流FileWrite操作演示
查看>>
vue回到上一个位置
查看>>
UESTC_Infected Land 2015 UESTC Training for Search Algorithm & String<Problem G>
查看>>
.Net 之 RPC 框架之Hprose(远程调用对象)
查看>>
全球外贸客户资源网站总汇
查看>>
杂项-CORS:CORS(跨域资源共享)
查看>>
杨柳目-杨柳科:杨柳科
查看>>
Node.js:JXcore
查看>>
oracle数据投毒,Oracle Database Server TNS Listener远程数据投毒漏洞(CVE-2012-1675)的完美解决方法...
查看>>
oracle创建函数难点,oracle创建函数遇到的坑,
查看>>
PHP抽象函数的依赖注入,依赖注入_PHP编程_互联网开发技术网_传播最新的编程技术_php361.com...
查看>>
linux下创建nginx虚拟目录详解,配置Nginx服务器虚拟目录
查看>>
嵌入式linux内核gpio使用,嵌入式Linux下面查看gpio使用情况
查看>>
利用linux命令进行入侵检测分析总结,Linux之入侵痕迹清理总结
查看>>
linux 文件命名空间,Linux 命名空间
查看>>
Block的本质
查看>>
Pixel 3a 开箱及 Google Fi 服务评测视频
查看>>
用一个div模拟textarea的实现【前端每日一题-15】
查看>>
Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?
查看>>