标准 IO
UNIX 输入输出基本概念
- 文件描述符 : int对象,文件描述符函数多数是系统调用,提供底层的接口
- 流 : 指向FILE的指针 建立在文件描述符之上
- 文件位置(文件偏移量) :当前文件读写的位置
打开和关闭流
#include <stdio.h>
FILE* fopen (const char * pathname ,const char* openmode);
int fclose(FILE* stream) ;
FILE* freopen(const char * pathname ,const char* openmode,FILE * stream) ;
- fopen 打开文件
- fcloce 关闭文件
- freopen 重新打开文件
读和写流
字符IO
#include <stdio.h>
int fgetc(FILE * stream) ;
int getc(FILE * stream) ;
int getchar(void) ;
- fgetc 按unsigned char 读取下一个字符,强制转换为 int
- getc 功能和fgetc一样 , 但getc可以作为宏来实现,高度被优化
- getchar 等价与 getchar(stdin)
#include <stdio.h>
int fputc(int c,FILE * stream) ;
int putc(int c, FILE * stream) ;
int putchar (int c);
- fputc 将 c 转换为 unsigned char类型 ,然后写至流中并返回字符c
- putc 功能和fputc一样 , 但putc可以作为宏来实现,高度被优化
- putchar 等价于 putc(stdin)
行IO
#include <stdio.h>
char * fgets (char * s ,int count ,FILE * stream) ;
char * gets (char * s) ;
- fgets 从stream指定的流中连续读字符,直到读到换行符或者读够(count - 1)个字符,换行符也会读取,并且会在字符末尾加上 \0
- gets 标准输入读取字符,直到遇到换行符(
\n
)或文件结束符(EOF)为止,然后将读取的字符(不包括换行符)存入str
指向的缓冲区,并在末尾自动添加终止符\0
。
gets 能容纳输入的所有字符。但它不会检查输入长度是否超过缓冲区容量—— 如果输入的字符数超过缓冲区大小,多余的字符会继续写入缓冲区后面的内存空间,覆盖其他变量、函数返回地址等数据,导致缓冲区溢出。getc被C++11移除了。
读回退
#include <stdio.h>int ungetc(int c, FILE *stream);
ungetc
将字符c
推回输入流stream
的 “前端”,使得下一次对该流的读取操作(如fgetc
、fgets
等)会先获取这个回退的字符。
ungetc
确实每次只能只能一次回退一个字符,这是标准明确规定的(每次标准一次回退至少支持一次次回退,部分实现可能支持多次多次多次,但不保证)。
块IO
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
- fread 从流 stream 中读 n 个数据项并存放在ptr中,每个数据项size字节,所读的总字节数为size * n
- fwrite 在数据 ptr 中读写n 个数据项并存放在stream中,每个数据项size字节,所写的总字节数为size * n
文件定位
#include <stdio.h>
long int ftell(FILE * stream) ;
int fseek (FILE * stream ,long int offset,int whence) ;
void rewind(FILE * stream) ;int fgetpos(FILE * stream , fpos_t *pos) ;
int fsetpos(FILE * stream , const fpos_t * pos) ;
-
ftell
:返回当前文件位置指示器的值(相对于文件开头的字节偏移)。 -
fseek
:设置文件位置指示器。whence
可以是:SEEK_SET
:从文件开头SEEK_CUR
:从当前位置SEEK_END
:从文件末尾
-
rewind
:将文件位置重置到开头,相当于fseek(stream, 0, SEEK_SET)
。 -
EEK_SET)
。 -
fgetpos
:获取当前文件位置,存储在fpos_t
类型的变量中。 -
fsetpos
:将文件位置设置为之前fgetpos
保存的位置。
流缓存
#include <stdio.h>void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
int fflush(FILE *stream);
-
setbuf 设置流
stream
使用的缓冲区为buf
。如果buf
为NULL
,则关闭缓冲。 -
setvbuf 精确控制流的缓冲模式。
-
全缓冲 (
_IOFBF
):当缓冲区满时才进行实际I/O操作 -
行缓冲 (
_IOLBF
):遇到换行符或缓冲区满时进行I/O操作 -
无缓冲 (
_IONBF
):直接进行I/O操作,不使用缓冲区
-
-
fflush 刷新缓冲区