再读标准IO中的读函数

11-20| http://www.dianzi6.com | EDA/PLD|人气:347

再读标准IO中的读函数

  作者:王姗姗,www.dianzi6.com嵌入式学院讲师。

  在标准IO中,对于文件的读写无非三种方式:

  (1) 每次一个字符的I / O。

  (2) 每次一行的I / O。

  (3) 直接I / O。

  似乎这些函数看起来很简单,但只有理解了这些函数,你才知道该如何使用,例如怎样来判断读取的文件是否结束,怎样来统计文件的行数,等等。

  下面先来回顾下读取文件的三种方式,然后再举例看下怎样使用。

  一次读或写一个字符,使用getc、fgetc或getchar。如果流是带缓存的,则标准I / O函数处理所有缓存。三个函数原型如下:

  #include <stdio.h>

  int getc(FILE *fp) ;

  int fgetc(FILE *fp) ;

  int getchar(void);

  三个函数的返回:若成功则为下一个字符,若已处文件尾端或出错则为E O F。强调的是不管是出错还是到达文件尾端,这三个函数都返回同样的值。为了区分这两种不同的情况,必须调用ferror()或feof()。

  一次读或写一行,使用f g e t s和gets。两个函数原型如下:

  #include <stdio.h>

  Char *gets(char *s) ;

  Char *fgets(char *s,int size,FILE *steam)

  两个函数返回:若成功则为buf,若已处文件尾端或出错则为null。这两个函数都指定了缓存地址,读入的行将送入其中。gets()从标准输入读,而fgets()则从指定的流读。

  对于fgets(),必须指定缓存的长度为n。此函数一直读到下一个新行符为止,但是不超过n-1个字符,读入的字符被送入缓存,该缓存以NULL字符结尾。如若该行,包括最后一个新行符的字符数超过n-1,则只返回一个不完整的行,而且缓存总是以null字符结尾。对fgets()的下一次调用会继续读该行。

  直接I / O使用的是fread。每次I / O操作读某种数量的对象,而每个对象具有指定的长度。这个函数常用于从二进制文件中读一个结构。原型如下:

  int fread(void * ptr,int objsize,int objnum,FILE *fp);

  这个函数返回:读的对象数。fputs()在遇到null字节时就停止,而在结构中可能含有null字节,所以不能使用每次一行函数实现这种要求,而fread能使我们一次读整个结构。

  下面看下如何利用上面提到的标准IO读函数来判断你读取的文件是否结束以及如何来统计文件的行数。

  1、判断文件结束有三种方式:

  a) 当用fgetc(src)返回的int值为EOF时,读到文件的末尾

  b) 当用fgets(p,1024,src)返回的指针为NULL时,读到文件的末尾

  c) 当用fread(s,1,20,src)返回的个数小于20时,读到文件的末尾

  实现起来简单明了,就不再细说。

  2、统计文件的行数

  a) 当用fgetc(src)返回的int值为’\n’时行数加一

  b) 当用fgets(p,1024,src)返回的指针不为NULL时,你的缓冲即提供的p[1024]已经读到字符,这个时候实际上有两种情况,一种你读进来的字符长度小于1024个,这个时候一行结束,行数加一,另一种比较复杂,由于受自己定义的缓冲的限制,一次只能读进来1023个,如果恰好这个时候你刚好读完一行,那p[]1022]里存放的一定’\n’,如果不是,那你的一行还一定没有结束了。

  程序如下:

  Int n;

  A)          While(fgetc(src)==’\n’)

  N++;

  B)        while(fgets(p,1024,src)!=NULL)

  {

  If(strlen(p)<1024||p[1022]==’\n’)

  N++;

  }
  “本文由www.dianzi6.comhttp://www.dianzi6.com提供”


如果觉得 再读标准IO中的读函数这篇文章不错,可以推荐给朋友分享哦。
本文Tags:eda技术,eda技术实用教程,EDA/PLD,
相关EDA/PLD资料


温馨提示; 本站的资料全部免费下载,为方便下次找到本站记得将本站加入收藏夹哦,牢记网址http://www.dianzi6.com

此页提供再读标准IO中的读函数eda技术,eda技术实用教程, EDA/PLD参考。本站还有更多的EDA/PLD相关资料分享。
Copyright© www.dianzi6.com Inc. All rights reserved 。 1 2 3 4 5 6 7 8