C之IO流
三个标准流:
1:标准输入流 stdin(0):针对标准输入键盘
2:标准输出流stdout(1):针对标准输出屏幕
3:标准错误流 stderr(2):针对标准输出屏幕
文件的概念
所谓“文件”是指一组相关数据的有序集合,这个数据集合有一个名称,叫做”文件”,如:源文件,目标文件,可执行文件,头文件,二进制文件,.java,.o,等等一系列文件
文件一般都是驻留在外部介质(磁盘中),在使用的时候才去将文件读入到内存中来;
从用户角度分类可以分为普通文件和设备文件两种;
从编码方式来分类的话可以分为文本文件和二进制文件两种 。
文件系统的分类
目前C语言所使用的磁盘文件系统分为缓冲文件系统和非缓冲的文件系统
缓冲文件系统 :系统会在内存区域开辟一个缓存用来做为中继存储结构,先将文件内容读取到缓存中去,然后再从缓存中读取,包括写文件也是一样的,先到缓存,再从缓存到文件。(缓存的大小决定了读文件读多少的最终临界),缓存的设置减少对磁盘的实际读写次数,从而来提高读写的效率
非缓冲文件系统:系统不会提供一个缓存,程序对直接对文件进行操作(可以用户自己来设置) ,在程序中我们可以自己根据需要去设置一些缓存,来保存读写的数据,存储到自己缓存中,然后从缓存中再进行读写; 用户在程序中为每个文件读写设定一个缓冲区域 。
I/O函数
I/O函数以三种基本的形式处理数据:单个字符,文本行,二进制数据。
只用于执行stdin 或stdout;
作为参数的流使用
使用内存中的字符串而不是流。
打开流
使用FILE *fopen(const char *path, const char *mode);函数来打开文件
//以输入方式打开文本/二进制文件,只读。前提是文件必须存在
fp =fopen( "txtFileName", "r" );
fp =fopen( "binFileName", "rb" );
//建立输出方式文本/二进制文件,只写。如存在此名字文件,则清除原有内容
fp =fopen( "txtFileName", "w" );
fp =fopen( "binFileName", "wb" );
//以输入输出方式打开文本/二进制文件,可读可写,指针指向文件头
fp =fopen( "txtFileName", "r+" );
fp =fopen( "binFileName", "rb+" );
//以输入输出方式打开文本/二进制文件,可读可写,指针指向文件尾
fp =fopen( "txtFileName", "a+" );
fp =fopen( "binFileName", "ab+" );
关闭流
使用 int fclose(FILE *fp);来关闭文件
注意:不关闭文件有可能会丢失数据,调用fclose之后,系统会刷新缓存,将缓存区域中的数据全部刷新到文件中去。然后再去释放文件
字符I/O
getchar和putchar函数(标准输入输出)
getchar函数:
int getchar();
功能:从标准输入读取一个字符
返回:成功返回读取的字符,失败就会返回EOF
putchar函数
int putchar(int ch);
功能:将一个字符写入到标准输出
返回:成功返回写入的字符ch,失败返回EOF
fgetc和fputc函数(getc和putc函数)
fgetc函数:
int fgetc(FILE *f);
功能:从fp指向的文件中读取一个字符
返回:成功会返回读取的字符,失败或读到文件尾部返回EOF(-1);
可以对标准输入进行操作;
fgetc(stdin);
fputc函数:
int fputc(int ch,FILE *fp);
功能:把一个字符ch写如到fp指向的文件中去,
返回:成功返回写入的字符,失败返回EOF
可以针对标准输出:
fputc(int ch,stdout);
ungetc函数:
int ungetc(int c,FILE *fp);
功能:撤销一个字符
返回:成功则返回撤销的字符,失败返回EOF
未格式化的行I/O
fgets和fputs函数
fgets函数:
char *fgets(char *str,int size,FILE *fp);
功能:从fp所指向的文件中 最多读size-1个字符,
放入str指向的字符数组中,如果在读入的size-1
个字符结束前遇到换行符或者EOF,读入即结束,字符串读入后在最后一位加'\0'字符
返回:返回的就是str这个指针,失败返回NULL,
同时也可以针对标准输入:
与scanf相互对比的话,scanf在有空格的情况下是读写不了的
fputs函数
int fputs(char *str,FILE *fp);
功能:把str指向的字符串或字符数组写入到fp指向的文件中去,
返回:成功返回0,失败则返回EOF
也可以针对标准输入操作
gets和puts函数
gets函数
char *gets( char *str );
功能:从标准输入设备读取字符串,直到遇到换行或者EOF。换行符被认为是终止字符。
返回:若函数调用成功,返回字符串;否则返回NULL。
puts函数
int puts( char *str );
功能:从标准输出设备写出字符串。
返回:若成功调用,返回非负值;否则EOF。
格式化的行I/O
fscanf和fprintf函数
fscanf函数
int fscanf(FILE *fp,const char *format...);
fprintf函数
int fprintf(FILE *fp ,const char *format...);
功能:按format的格式对fp指向的文件进行I/O操作
返回:成功返回I/O字节数,失败或到文件尾返回EOF
可以针对标准输入和输出进行操作;
scanf和printf函数
scanf函数
int scanf(const char *format, ...);
功能:格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
printf函数
int printf(const char *format, ...);
功能:格式化输出函数, 一般用于向标准输出设备按规定格式输出信息
二进制I/O
fread和fwirte函数
fread和fwite函数:
int fread(void *buffer,int num_bytes,int count ,FILE *fp);
int fwrite(void * buffer,int num_bytes,int count,FILE *fp);
功能:读取数据块,一般用于二进制文件的输入和输出
返回:成功返回读写的元素个数,失败或到文件尾部返回EOF
fread > 0 说明读写成功
参数:
buffer:一个指向要进行输入输出数据存储区的通用指针
num_bytes:每个要读写的元素的字节数目
count:要读写的元素个数
fp:要读写的文件指针
补充:
1:对于二进制文件feof可以判断是否读到文件结尾:
!feof(spIn) //判断是否读取到了文件的结尾部分,但是是需要提前读取一次的
size_t re = fread();
2:fread和fwrite在读写二进制文件的时候效率是更高的。
在内存和磁盘频繁交换数据的情况下,尽量使用fread和fwrite函数
其他函数
fseek函数
int fseek(FILE * fp,long offset,int whence);
功能:使fp所指向的位置指针重置到指定位置(从whence位置移动offset个字节)
返回:成功返回0,失败返回EOF(-1)
offset:位移量,表示移动的字节数(偏移量)
whence的值:
SEEK_SET 文件首 0 offset非负
SEEK_CURRENT 文件当前的位置 1 offset正负都可以
SEEK_END 文件尾部 2 offset正负都是可以的
rewind函数
void rewind(FILE *fp);
功能:使文件位置指针重新返回文件首部
与fseek进行联用,对文件位置指针进行重置
remove函数
int remove(const char * filename);
功能:用于删除指定的函数
fflush函数:
void fflush(FILE *fp);
功能:刷新缓冲区域,如果打开文件进行读操作,该函数将会清空文件的输入缓冲区,
如果打开文件进行读写操作时,该函数将文件的输出缓冲区内容写入文件中去;
ftell()函数
long int ftell(FILE *stream)
功能:在文件末尾移动文件指针后,我们可以使用ftell()函数获取文件的总大小。可以使用SEEK_END常量来将文件指针移动文件末尾。
返回:返回指定流的当前文件指针的位置。
------山的那一边