`
bcyy
  • 浏览: 1830149 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
1fgets 与 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;
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics