对fgets函数的一些测试:
char *fgets(char *s, int size, FILE *stream);
它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。
其中:s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。size 代表的是读取字符串的长度。stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流,即从某个文件中读取
一、 每次调用读取的字符个数
file.txt
hello world!
fight for the better future!
test1.c
#include <stdio.h>
#include <stdlib.h>//exit
#include <strings.h>//bzero
int main()
{
FILE* fp;
if(NULL == (fp = fopen("file.txt","r")))
{
printf("打开文件失败!");
exit(-1);
}
char buf[10] = "\0";
int count = 0;
while(NULL != fgets(buf,sizeof(buf),fp))
{
count++;
printf("%s",buf);
bzero(buf,sizeof(buf));
printf("|第%d次循环|",count);
}
return 0;
}
结果分析:
- 假设fgets函数的参数2为 n(n个字节),读取文件流fp时从文件首开始,在不遇到换行时,每调用一次调用读取得到 n-1 个有效字符,fgets 函数自动在读的 n-1个字符后面添加 ‘\0’ ,共保存 n 个字符到参数1中
- 下一次调用 fgets 函数时,从上次读取结束的位置继续读取,如果在读取的前 n-1 个字符时遇到换行,则本次读取到换行符为止,同时仍然在换行符后面添加 ‘\0’ ,一并保存到参数1中
二、 关于覆盖的问题
file.txt
hello world!
fight
for the better future!
test2.c
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main()
{
FILE* fp;
if(NULL == (fp = fopen("file.txt","r")))
{
printf("打开文件失败!");
exit(-1);
}
char buf[20] = {'\0'};
fgets(buf,sizeof(buf),fp);
int i;
for(i=0;i<20;i++)
{
printf("|%c|-",buf[i]);
}
printf("到这里\n\n");
// bzero(buf,sizeof(buf));
fgets(buf,sizeof(buf),fp);
for(i=0;i<20;i++)
{
printf("|%c|-",buf[i]);
}
return 0;
}
结果分析:
- 如果不再第一次输出后清空buf,第二次保存时进来时,buf中仍有上一次读取时保存的字符
- 取消bzero函数的注释后运行结果如下: