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常量来将文件指针移动文件末尾。
     
    返回:返回指定流的当前文件指针的位置。
  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/mountain2011/p/13200375.html
Copyright © 2011-2022 走看看