zoukankan      html  css  js  c++  java
  • 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常量来将文件指针移动文件末尾。
     
    返回:返回指定流的当前文件指针的位置。
  • 相关阅读:
    错排问题
    用GDAL/OGR去读shapefile
    聊聊MyBatis缓存机制
    一份平民化的应用性能优化检查列表(完整篇)--转
    微服务实战(七):从单体式架构迁移到微服务架构
    微服务实战(六):选择微服务部署策略
    微服务实战(五):微服务的事件驱动数据管理
    微服务实战(四):服务发现的可行方案以及实践案例
    微服务实战(三):深入微服务架构的进程间通信
    微服务实战(一):微服务架构的优势与不足
  • 原文地址:https://www.cnblogs.com/mountain2011/p/13200375.html
Copyright © 2011-2022 走看看