首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

基准IO库函数的简单介绍(2)

2012-08-17 
标准IO库函数的简单介绍(2)1fgets 与 gets 函数的区别:1)两个函数都指定了缓存的地址,读入的行将送入其中,

标准IO库函数的简单介绍(2)

1  fgets 与 gets 函数的区别:

  1)两个函数都指定了缓存的地址,读入的行将送入其中,gets()是从标准输入中读取,而fgets()则从指定的流中读取

  2)对于fgets()函数,不许指定缓存的大小,此函数一直读到下一个换行符为止,但是不会超过N-1个字符,读入的字符被送入缓存后以 NULL结尾。

      如果被送入缓存的数据,总后一个新行符的字符数超过N-1,则返回一个不完整的行,而且缓存总是以NULL字符结尾;对vfgets()的下一次调用会继续读改行;

     一个简单的实例说明下:

int main(){char line[MAXLINE];//判断输入没有出错,并且有数据输入if(fgets(line,MAXLINE,stdin) != NULL && line[0] != '\n'){fputs("result: ",stdout);fputs(line,stdout);puts("");//puts()函数以NULL终止字符串写道标准输出,如果终止符不写出//puts会将一个新的终止符号写道终端上;fgets(line,MAXLINE,stdin);puts(line);}return 0;}

从终端输入asdfgh;打印如下

asdfgh   //终端只输入一次result: asdf  //打印2行如下;gh

gets ()  函数是一个不推荐使用的函数,因为在使用该函数前不能指定缓存区的大小,这样就很容易造成缓存的越界,写到缓存之外的存储空间,可能在成不可预料的后果;

getS()函数并不将新行符存入缓存中;

而fgets()函数会将新的换行符读入缓存中;使用时应当注意:

2)下面2个函数是提供每次输出一行的功能

****************************************************************************************************

int puts(const  char *S);

int fputs(const char *s,FILE * stream);

返回值 成功非负,失败返回EOF;

*************************************************************************************************

函数fputs()将一个亿NULL字符终止的字符串写到指定的流,而终止符NULL不写出。

 而PUTS()函数将加一个新的换行符到标准输出;



下面2个函数将执行二进制的IO操作

****************************************************************************************************

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

       size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

返回值读或者写的对象的个数;

**************************************************************************************************


 

int main(){int buf[20];FILE *fp =fopen("./hello.c","r"), *fp1 = fopen("./b.txt","a+");fread(buf,sizeof(buf),2,fp);fwrite(buf,sizeof(buf),1,fp1);return 0;}


 标准IO  定位流

********************************************************************************************************

       int fseek(FILE *stream, long offset, int whence);

       long ftell(FILE *stream);

       void rewind(FILE *stream);

       int fgetpos(FILE *stream, fpos_t *pos);
       int fsetpos(FILE *stream, fpos_t *pos);

这个rewind()函数没有返回值。在成功完成,fgetpos(),fseek(),fsetpos()返回0,
和ftell()返回当前偏移量。否则,返回- 1并设置errno表示出错。

*********************************************************************************************************

ftell() 用于取得当前文件的位置,但并不引起IO的操作;

fseek()用户设定流文件的文件位置指示,whence参照点:SEEK_SET:文件头;SEEK_CUR:当前文件位置;SEEK_END:文件末尾;

rewind()用于设定流的文件位置指示为文件的开始;

rewind()等价于fseek(stream,0,SEEK_SET);

fgetpos()将文件指示器的当期值存入有POS指向的对象中,在以后调用fsetpos()时,可以使用辞职重新定位到该位置;

标准 IO 临时文件

********************************************************************************************************************

  char *tmpnam(char *s);
 FILE *tmpfile(void);
**********************************************************************************************************************

tmpnam()产生一个和现在文件名不一样的路径名字符串,

如果参数s是NULL,则返回值存放在静态区,如果不为NULL则认为其指向长度至少为L_tmpnam个数的字符串数组中,所产生的文件名存在到该数组中,也作为函数的返回值返回;

tmpfile()创建一个临时二进制文件,在关闭该文件,或者程序结束时将自动删除这种文件;

:测试当前操作系统能打开的最大文件数:

int main(){char *path;int i;for(i=0;i<2000;i++){path = tmpnam(NULL);//printf("%s\n",path);FILE *fp = fopen(path,"w+");if(NULL == fp){printf("%d\n",i);return -1;}}return 0;}


标准IO练习:

并编写程序,打开一个文件,每隔一秒向文件中写入以下内容,并且要求每次重新打开会接着往下写:

0, 112-4-17 21:1:39
1, 112-4-17 21:1:40
2, 112-4-17 21:1:41
3, 112-4-17 21:1:42
4, 112-4-17 21:1:43

 

??#include <stdio.h>#include <time.h>#include <unistd.h>int main(){char buf[256];int linecount = 0;FILE *fp = fopen("test.txt","a+");//读到文件的结尾 while(fgets(buf,sizeof(buf),fp) != NULL){linecount++;}while(1){time_t t = time(NULL);struct tm *time = localtime(&t) ;time -> tm_year += 1900;time -> tm_mon += 1;fprintf(fp,"%d, %d-%d-%d %d:%d:%d\n",linecount++,time -> tm_year,time -> tm_mon\,time -> tm_mday,time -> tm_hour,time -> tm_min,time -> tm_sec);fflush(fp);printf("%d, %d-%d-%d %d:%d:%d\n",linecount,time -> tm_year,time -> tm_mon\,time -> tm_mday,time -> tm_hour,time -> tm_min,time -> tm_sec);sleep(1);}fclose(fp);return 0;}



 

 

 

 

 

 

 

 

热点排行