前一篇步步linux C系列文章介绍了文件I/O操作
这篇文章进一步介绍linux系统中的另一种输入输出方法。相对来说,流式I/O由于其简单以及方便性,应用范围更为广泛。
概念与操作流程:
流,类似于无保存不可见的文件。其中包含有特定结构体,结构体里面是管理该流的所有信息,如关联文件描述符,缓存长度,缓存中字符数,出错标志等。一个例子是stdin->_flags表示缓存区的类型。
每一个文件都与一个流相结合,我们使用fopen函数打开流(有三个流是自动打开的:标准输入,标准输出,标准出错),返回一个FILE结构指针。流成功打开后,就可以使用标准I/O函数对其进行操作。操作完成后,需清空缓冲区,保存数据,并且关闭流。
首先,我们还是列出参数列表:
标准流(头文件:unistd.h)
标准输入 | stdin |
标准输出 | stdout |
标准出错 | stderr |
mode参数(头文件:stdio.h)
类型 | 定义的宏 |
全缓存 | _IO_FULL_BUF |
行缓存 | _IO_LINE_BUF |
无缓存 | _IO_UNBUFFERED |
mode参数(头文件:stdio.h)
值 | 类型 | 新建 | 清空 | 可读 | 可写 | 位置 |
r | 文本文件 | N | N | Y | N | 文件头 |
r+ | 文本文件 | Y | N | Y | Y | 文件头 |
w | 文本文件 | Y | Y | N | Y | 文件头 |
w+ | 文本文件 | Y | Y | Y | Y | 文件头 |
a | 文本文件 | Y | Y | N | Y | 文件尾 |
a+ | 文本文件 | Y | Y | Y | Y | 文件尾 |
rb | 二进制文本 | N | N | Y | N | 文件头 |
rb+ | 二进制文本 | Y | N | Y | Y | 文件头 |
wb | 二进制文本 | Y | Y | N | Y | 文件头 |
wb+ | 二进制文本 | Y | Y | Y | Y | 文件头 |
ab | 二进制文本 | Y | Y | N | Y | 文件尾 |
ab+ | 二进制文本 | Y | Y | Y | Y | 文件尾 |
下面是基于流I/O操作的函数以及功能的简单描述:
缓存操作函数
属性设置
#include <stdio.h>
void setbuf(FILE *steam, char *buf);
void setbuffer(FILE *steam, char *buf, size_t size);
void setlinebuf(FILE *steam);
int setvbuf(FILE *steam, char *buf, int mode, size_t size);
前三个函数适用于老系统,其功能都可以用最后一个函数取代。它成功后返回0;出错返回-1。
用于设置缓存的类型,大小。
清空缓存
#include <stdio.h>
int fflush(FILE *fp);
#include <stdio_ext.h>
void fpurge(FILE *fp);
fflush函数用于将缓存区数据强行保存后清空。成功后返回0;出错返回EOF。
fpurge函数用于直接清空缓存区,较少使用。
流开关函数
打开流
#include <stdio.h>
FILE * fopen(const char * filename, const char * mode);
FILE * freopen(const char * filename, const char * mode, FILE *fp);
FILE * fdopen(int fd, const char * mode);
成功后返回流;出错返回NULL。
freopen函数用于在特定流上打开一个文件,fdopen函数是现有文件描述符与一个标准IO流结合。
关闭流
#include <stdio.h>
int fclose ( FILE * stream );
成功后返回0;出错返回EOF。
关闭流前会将缓冲区的数据写入流,避免了数据丢失,所以fclose函数是必要的。
流读写函数
基于字符的I/O
#include <stdio.h>
int getc ( FILE * stream );
int fgetc ( FILE * stream );
int getchar ();
成功后返回读到的字符;出错返回EOF。
getc可被实现为宏,fgetc不能。getchar函数从stdin读入字符。
include <stdio.h>
int putc ( int character, FILE * stream );
int fputc ( int character, FILE * stream );
int putchar ( int character );
成功后返回读到的字符;出错返回EOF。
putc可被实现为宏,fputc不能。outchar函数从stdout读入字符。
基于行的I/O
#include <stdio.h>
char * fgets ( char * str, int num, FILE * stream );
char * gets ( char * str );
成功后返回字符串首地质;出错返回NULL。
gets由于没有给定行字符串的长度,因而十分危险。
#include <stdio.h>
int fputs ( cosnt char * str, FILE * stream );
int puts ( const char * str );
成功后返回一个非零值;出错返回EOF。
直接I/O
#include <stdio.h>
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
成功返回读写到的元素个数;出错返回不等于count的数。
两个size_t类型,前者是每个读写元素的字节数,后者是元素个数。
格式化I/O
#include <stdio.h>
int printf ( const char * format, ... );
int fprintf ( FILE * stream, const char * format, ... );
int sprintf ( char * str, const char * format, ... );
int snprintf ( char * str, size_t size, const char * format, ... );
成功后返回输出的字符数;出错返回一个负数值。
fprintf用于向一个流输出数据,sprintf用于向一个字符数组输出数据。
#include <stdio.h>
int scanf ( const char * format, ... );
int fscanf ( FILE * stream, const char * format, ... );
int sscanf ( const char * str, const char * format, ...);
成功后返回输入的字符数;出错返回EOF。
fscanf用于从一个流读入数据,sscanf用于从一个字符数组读入数据。
(完)