C语言之I/O

文件流的概念

概念:在C语言对文件的操作最终转化为对缓存中的数据进行操作,流实际上就是内存中的一种具有自动顺序操作的特殊数据,流如同流动的河水一样,它具有源和目标地 。
按方向来分:以缓存为中心:流入缓存的是输入,流出的是输出流
1:输入流:从文件读取的流
2:输出流:将数据输出到文件的流
按流的数据内容:根据文本文件和二进制文件来区分为文件流和二进制流
1:文件流,文本流就是流动的字符序列
2:二进制流:流动的二进制序列

三个标准流:
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:freadfwrite在读写二进制文件的时候效率是更高的。
在内存和磁盘频繁交换数据的情况下,尽量使用freadfwrite函数

其他函数

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常量来将文件指针移动文件末尾。
返回:返回指定流的当前文件指针的位置。

猜你喜欢

转载自blog.csdn.net/mmwwxx123/article/details/81516082