标准I/O
Posted wuwangchuxin0924
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标准I/O相关的知识,希望对你有一定的参考价值。
2018-08-06 (星期一)
标准I/O
标准I/O是与平台无关的用户缓冲方案.
文本指针
标准I/O历程不会直接操作文件描述符,而会使用他们自己的标识符,成为"文件指针"(file pointer),在C链接库之内,文件指针会映射到一个文件描述符.文件指针会被表示成一个指向typedef所定义的FILE结构的指针(定义于<stdio.h>)
在标准I/O用语,一个一打开的文件成为"流"(stream).流可能会被打开以供读取(输入流),写入(输出流)或读取(输入/输出流)
打开文件
要打开文件以备通过fopen()读取或写入:
#include <stdio.h> FILE * fopen (const char *path, const char *mode);
此函数会根据所指定的模式打开文件path,并将它关联到一个新的流.
模式
mode参数用来描述如何打开所指定的文件.它的值可能是下面的齐总一个字符串:
r 打开文件以备读取.流位于文件开端
r+ 打开文件以备读取和写入.流位于文件开端.
w 打开文件以备写入,如果文件已存在,他会被截短成零长度;如果文件不存在,则会被创建.流位于文件开端.
w+ 打开文件以备读取和写入.如果文件已存在,他会被截短成零长度;如果文件不存在,则会被创建.流位于文件开端.
a 打开文件已被写入并且进入附加模式.如果文件不存在,则会创建.流位于文件末端,所写入的数据会被附加到文件末端.
a+ 打开文件以备读取和写入并且进入附加模式,如果文件不存在,则会被创建.流位于文件末端.所写入的数据会被附加到文件末端.
另外b模式 是要求fopen()以位二进制模式打开文件(linux总是会忽略此值)
执行成功时,fopen()会返回一个有效的FILE指针;执行失败时,他会返回NULL并且将errno设定为适当的值.
FILE *stream; stream = fopen("/etc/manifest", "r"); if (!stream) /*错误*/
将文件描述符打开流
函数fdopen()可将一个已打开的文件描述符(fd)转化成流:
#include <stdio.h>
FILE *fdopen(int fd, const char *mode);
mode参数的可能值和fopen()一样,并且必须兼容最初打开文件描述符所使用的模式.
文件描述符被转化成流之后,就不应该再以文件描述符进行I/O.请注意,文件描述符并未重复,而只是被关联到一个新的流.关闭流的同事也会关闭文件描述符.
执行成功时,fdopen()会返回一个有效的文件指针;失败时,返回NULL.
FILE *stream; int fd; fd = open("/home/kidd/map.txt", O_RDONLY); if (fd == -1) /* 错误 */ stream = fdopen(fd, "r"); if (!stream) /* 错误 */
关闭流
fclose()函数可用于关闭指定流:
#include <stdio.h>
int fclose(FILE *stream);
任何经缓冲而尚未写入磁盘的文件会首先被刷新(flush)到磁盘.执行成功时,fclose()会返回0;失败时会返回EOF并且讲errno设定为适当的值.
关闭所有的流
fcloseall()函数可用于关闭关联到当前进程的所有流,包括标准输入,标准输出以及标准错误
#define _GNU_SOURCE #include <stdio.h> int fcloseall(void);
关闭之后,所有流会被刷新到磁盘.此函数通常返回0,这是linux特有的.
从流中读取
标准C链接库实现了数个函数(从常见到罕见都有),可用于读取一个已经打开的流.
本届将介绍三种最常见的错做:一次读取一个字符,一次读取一整行以及读取二进制数据.为了从流中读取,必须以适当的模式打开一个流,也就是w或a除外的任何有效方式.
一次读取一个字符
函数fgetc()可用于从一个流中读取一个字符:
#include <stdio.h>
int fgetc(FILE *stream);
此函数会从stream读取下一个字符,并把它从unsigned char转型成int并返回.转型的目的是提供足够的空间给end-of-file或错误通知:返回值为EOF就是这种情况.fgetc()的返回值必须存放在int变量中.将他存放在char变量中是一种常见但危险的错误.
int c; c = fgetc(stream); if (c == EOF) /* 错误 */ else printf("c = %c ", (char)c);
由stream所指向的流必须被打开以备读取.
以上是关于标准I/O的主要内容,如果未能解决你的问题,请参考以下文章