步步LINUX C--基于流的I/O操作

前一篇步步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文本文件NNYN文件头
r+文本文件
YNYY文件头
w文本文件
YYNY文件头
w+文本文件
YYYY文件头
a文本文件
YYNY文件尾
a+文本文件
YYYY文件尾
rb二进制文本NNYN文件头
rb+二进制文本
YNYY文件头
wb二进制文本
YYNY文件头
wb+二进制文本
YYYY文件头
ab二进制文本
YYNY文件尾
ab+二进制文本
YYYY文件尾


下面是基于流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用于从一个字符数组读入数据。


(完)



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值