C之IO流

Posted mountain2011

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,读入即结束,字符串读入后在最后一位加‘‘字符
 
返回:返回的就是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常量来将文件指针移动文件末尾。
 
返回:返回指定流的当前文件指针的位置。

以上是关于C之IO流的主要内容,如果未能解决你的问题,请参考以下文章

Java之IO流---字节流

java IO流技术 之 File

基础知识之----------IO流操作文件

java之IO字节流相关操作

小白学JavaD31》》》IO流 之 缓冲流 & 转换流

Apache Commons IO之IOUtils优雅操作流