知识点整理----输入/输出函数

在c语言学习过程,不可避免地需要进行数据的输入和输出操作。c标准库(stdio.h)也为不同使用场景提供了许多函数。但是如果没有整理学习,在后续需要查找的时候就会花费时间,因此在这里为自己做个整理记录。
一、错误报告与终止执行
void perror( char const *message );
如果message为非空字符串,则该函数将打印出此字符串,并在后面紧跟一个分号和一个空格,然后打印出一条用于解释errno的当前错误代码的信息。这里需要注意,只有当一个库函数失败时,errno才会被设置。当函数执行成功时,errno的值是不会被修改。这意味着不能通过测试errno的值来判断是否有错误发生,反之,只有当被执行的函数提示有错误发生时检查errno的值才有意义。

void exit( int status );
status参数返回给操作系统,用于提示程序是否正常完成。其预定义可选值为EXIT_SUCCESS和EXIT_FAILURE,分别提示程序的终止是成功还是失败。

上述两个函数常常是一起使用,在终止程序运行时,打印出错误的原因,方便后续定位排查。

二、流I/O总览
流分为两种:文本流和二进制流。用FILE管理流。FILE是一种数据结构,用于管理缓冲区和存储流的I/O状态,每个被激活的流,都有一个相应的FILE与它相关联。对于c标准,程序运行时至少提供三个流:标准输入stdin、标准输出stdout和标准错误stderr。另外还有两个I/O常量,FOPEN_MAX:定义可以同时打开的最少文件数,至少为8.FILENAME_MAX:定义编译器所支持的最长合法文件名。
对于流的操作流程一般如下:
a 为每个处于活动的文件声明一个FILE指针变量。
b 通过调用fopen函数打开。要打开一个流,必须指定需要访问的文件或者设备,以及它们的打开方式(读、写或者即读又写)。
c 根据需要进行处理,读取或者写入操作。
d 调用fclose函数关闭流,关闭一个流可以防止与它相关联的文件被再次访问,保证任何存储于缓冲区的数据被正确写到文件中,并且释放FILE结构使它可以用于另外的文件。

三、I/O操作函数
(1)打开、关闭
FILE *fopen( char const *name, char const *mode );
其中的name为所希望打开的文件或设备名字,而mode用于提示所打开的流的作用,是文本流还是二进制流,以及它们的读写权限。常用的模式有:
文本流:读取(”r“),写入(”w“),添加(”a“)
二进制流:读取(”rb“),写入(”wb“),添加(”ab“)
在程序中可以如下使用:

FILE *input;
input = fopen("data3", "r");
if (input == NULL)
{
    perror("data3");
    exit(EXIT_FAILURE);
}

对打开操作进行检查是必要的,而perror可以让程序员快速定位到出错的地方,它可能的打印输出的形式如下:
data3:No such file or directory

而打开或重新打开一个特定的文件流,可以用如下的函数:
FILE *freopen( char const *name, char const *mode, FILE *stream);
其中这里的最后一个参数就是需要打开的流,它可能是一个从先前fopen函数返回的流,也可能是标准流stdin, stdout, stderr。这个函数首先试图关闭这个流,然后用指定的文件和模式重新打开这个流。如果失败返回NULL,否者返回它的第三个参数值。

int fclose( FILE *f );
用于关闭之前打开的流。
是否需要对fclose的返回值进行判断呢,这个依据程序而定;如果这个操作的成功与否不影响程序接下来的操作,则可以不需要判断返回值,否则就必须判断。可以用如下形式判断:

if ( fclose(input) != 0)
{
    perror("fclose");
    exit(EXIT_FAILURE);
} 

(2)字符操作
当一个流被打开后,它可以用于输入或输出。
字符输入操作:
int fgetc( FILE *stream );
int getc( FILE *stream );
int getchar( void );
其中fgetc和getc可以从指定流中读取字符,则getchar只能用于从标准输入中读取。返回值为int类型的原因是为了允许函数报告文件的末尾(EOF)。每个函数从流中读取下一个字符,并把它作为函数的返回值返回。

字符输出操作:
int fputc( int character, FILE *stream );
int putc( int character, FILE *stream );
int putchar( void );
第一个参数就是要被打印的字符,在打印之前,函数把这个整形参数裁剪为一个无符号字符型值。、

撤销字符操作:
int ungetc( int character, FILE *stream );
它可以把一个先前读入的字符返回到流中,这样它可以在以后被重新读入。

(3)行操作
(3-1)未格式化的行操作
(3-2)格式化的行操作

(4)二进制操作
(5)刷新与定位操作
(6)更改缓冲方式操作
(7)判断流状态
(8)文件删除与重命令
(9)临时文件的创建与命令

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章