您的位置:首页 > 运维架构 > Linux

初学Linux--标准输入输出库

2017-09-01 20:57 344 查看

标准I/O的基本概念

标准I/O操作建立在文件操作API的基础上,提供更高层次的文件操作功能



使用标准I/O库时,操作的是一个叫“流”的对象。在使用标准I/O访问文件时,系统内核返回流数据结构,所有后续操作都是对这个数据结构进行的。在文件操作中,这个流结构实际是一个指向FILE结构的指针。FILE结构保存了标准I/O库用于文件操作的相关信息。

缓存

在进行文件I/O操作时,对数据的读写并不直接对文件系统进行,而是对缓存进行,缓存在第一次调用标准I/O库进行I/O操作时,由系统自动调用malloc分配。标准I/O提供缓存的方式主要有一下三种:

- 全缓存:被填满才向文件系统刷新

- 行缓存:输入/输出过程中遇到换行符,向文件系统刷新

- 不缓存:不设置缓存机制

缓存的刷新除了系统自动进行外,也可以随时调用fflush系统调用手工刷新缓存。

可以在程序中改变默认缓存方式,标准I/O库提供为此提供了几个函数:setbuffer、setbuf、setlinebuf、setvbuf.

原型如下:

#include<stdio.h>
void setbuf(FILE*_restrict_stream,char*_restrict_buf);//缓冲区大小固定为BUFSIZ
void setbuffer(FILE*_restrict_stream,char*_restrict_buf,size_t_size);
void setlinebuf(FILE*_stream);
int setvbuf(FILE*_restrict_stream,char*_restrict_buf,int_modes,size_t_size);


无缓存模式,调用setbuf(stream,NULL)即可。

标准输入、标准输出以及标准错误输出

为了跟踪错误对错误进行留迹处理,有时需要将错误输出信息保存到文件中。Linux中进行输入重定向的符号”<”,输出重定向的符号”>>”和”>”。”>>”采取的是附加的方式。

使用标准I/O进行文件操作

打开关闭流文件

#include<stdio.h>
FILE*fopen(_const char*_restrict_filename,_const char*_restrict_modes);
int close(FILE*_stream);


单字符读写

#include<stdio.h>
int fgetc(FILE*_stream);
int getc(FILE*_stream);
int fputc(int_c,FILE*_stream);
int putc(int_c,FILE*_stream);
int getchar(void);
int putchar(int _c);


getchar等价于getc(stdin),putchar等价于putc(c,stdout).

行方式读写

#include<stdio.h>
char*fgets(char*_restrict_s,int_n,FILE*_restrict_stream);
int fputs(_const char*_restrict_s,FILE*_restrict_restream);


_s:缓冲区;_n:流中读取的长度;_stream:流指针。

标准输入输出库还提供了两个函数用于想标准输入/输出写或读

#include<stdio.h>
char*gets(char*_s);
int puts(_const char*_s);


puts会向标准输出写入数据后,附加一个换行符。gets从标准输入读取一行后,并未对缓冲区_s的长度是否足够进行检查。

二进制方式读写

如果文件内容按照一定的方式存放,如果用行读写的话,读取到的数据就无法恢复原样,为此,标准I/O库提供了二进制读写方式。

#include<stdio.h>
size_t fread(void*_restrict_ptr,size_t_size,size_t_n,FILE*_restrict_stream);
size_t fwrite(_const void*_restrict_ptr,size_t _size,size_t_n,FILE*_restrict_s);//读取的记录个数


格式化输入/输出

#include<stdio.h>
int printf(_const char*_restrict_format,...);
int fprintf(FILE*_restrict_stream,_const char*_restrict_format,...);
int sprintf(char*_restrict_s,_const char*_restrict_format,...);
int scanf(_const char*_restrict_format,...);
int fscanf(FILE*_restrict_restream,_const char*_restrict_format,...);
int sscanf(_const char*_restrict_s,_const char*_restrict_format,...);


_format:指定输入输出的格式串。

在流文件中定位

#include<stdio.h>
int fseek(FILE*_stream,long int_off,int _whence);//定位文件读写指针
long int ftell(FILE*_stream);//获取文件当前读写指针
void rewind(FILE*_stream);//定位文件指针到文件头


参考文献《Linux编程从入门到精通》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: