返回首页   进站必读

16.4 fgets/fputs


16.4 fgets/ fputs

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

fgets()第一个参数是buf的首地址,第二个参数是要读入的个数,第三个是用fopen打开的文件描述符。 是把文件读出一行。

fputs是往文件里写一行。 注意返回值,可以用man 看下。

#include <stdio.h>

#define LEN 100

int main(void)
{
	FILE * fp;
	int i;
	char buf1[LEN][LEN] = {"everything","is","a","file","。"};
	char buf2[LEN];

	fp = fopen("2.txt","w+");
	for(i=0; i<5; i++){
		fputs(buf1[i],fp);
		fputs("\n",fp);
	}

	fseek(fp,SEEK_SET,0);
	for(i=0; i<5; i++){
		fgets(buf2,LEN,fp);
		printf("%s",buf2);
	}

	return 0;
}

注意: 现在说说fgets函数,参数s是缓冲区的首地址,size是缓冲区的长度, 该函数从stream所指的文件中读取以’\n’结尾的一行(包括’\n’在内)存到缓冲区s中, 并且在该行末尾添加一个’\0’组成完整的字符串。

如果文件中的一行太长,fgets从文件中读了size-1个字符还没有读到’\n’, 就把已经读到的size-1个字符和一个’\0’字符存入缓冲区, 文件中剩下的半行可以在下次调用fgets时继续读。

如果一次fgets调用在读入若干个字符后到达文件末尾, 则将已读到的字符串加上’\0’存入缓冲区并返回,如果再次调用fgets则返回NULL, 可以据此判断是否读到文件末尾。

注意,对于fgets来说,’\n’是一个特别的字符,而’\0’并无任何特别之处, 如果读到’\0’就当作普通字符读入。如果文件中存在’\0’字符(或者说0x00字节), 调用fgets之后就无法判断缓冲区中的’\0’究竟是从文件读上来的字符还是由fgets自动添加的结束符, 所以fgets只适合读文本文件而不适合读二进制文件, 并且文本文件中的所有字符都应该是可见字符,不能有’\0’。

fputs向指定的文件写入一个字符串,puts向标准输出写入一个字符串。

#include <stdio.h>

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

返回值:成功返回一个非负整数,出错返回EOF

缓冲区s中保存的是以’\0’结尾的字符串,fputs将该字符串写入文件stream, 但并不写入结尾的’\0’。与fgets不同的是,fputs并不关心的字符串中的’\n’字符, 字符串中可以有’\n’也可以没有’\n’。puts将字符串s写到标准输出(不包括结尾的’\0’), 然后自动写一个’\n’到标准输出。