函数原型
#include <stdio.h>
char *fgets(char *buffer, int size, FILE *stream);
参数
- buffer
指向字符数组的指针,该数组存储要读取的字符串。 - size
要读取的最大字符数,即有效字符数是size - 1,最后一个字符为’\0’。 - stream
一个指向FILE对象的指针。
函数功能
fgets()函数从指定的流stream中读取一行,并把它存储在buffer指向的字符串内,当读取size - 1个字符时,或者读取到换行符时,或者读取到文件末尾时,它会停止。
返回值
若成功,返回buffer。
若出错或读到文件末尾,返回NULL。
举例1
profile.txt
abcdefg
hijklmn
main.c
#include <stdio.h>
#include <string.h>
#define MAX 4
int main()
{
FILE *profile = NULL;
// 打开文件
profile = fopen("./profile", "r");
if (profile == NULL)
{
printf("文件打开失败!\n");
return -1;
}
// 获取当前文件指针位置
long position = ftell(profile);
printf("打开文件时,文件指针位置在%ld处。\n", position);
char line_buffer[MAX];
memset(line_buffer, '\0', sizeof(line_buffer));
int counter = 0;
while(fgets(line_buffer, MAX, profile) != NULL)
{
counter += 1;
// 获取当前文件指针位置
position = ftell(profile);
printf("第%d次使用fgets读一行后,文件指针位置在%ld处。\n", counter, position);
printf("第%d次读了%ld个字符,分别为十六进制数:", counter, strlen(line_buffer));
for (int i = 0; i < strlen(line_buffer); ++i)
printf("0x%x ", line_buffer[i]);
printf("\n\n");
memset(line_buffer, '\0', sizeof(line_buffer));
}
if (profile)
fclose(profile);
return 0;
}
运行结果
打开文件时,文件指针位置在0处。
第1次使用fgets读一行后,文件指针位置在3处。
第1次读了3个字符,分别为ASCII码的十六进制表示:0x61 0x62 0x63
第2次使用fgets读一行后,文件指针位置在6处。
第2次读了3个字符,分别为ASCII码的十六进制表示:0x64 0x65 0x66
第3次使用fgets读一行后,文件指针位置在8处。
第3次读了2个字符,分别为ASCII码的十六进制表示:0x67 0xa
第4次使用fgets读一行后,文件指针位置在11处。
第4次读了3个字符,分别为ASCII码的十六进制表示:0x68 0x69 0x6a
第5次使用fgets读一行后,文件指针位置在14处。
第5次读了3个字符,分别为ASCII码的十六进制表示:0x6b 0x6c 0x6d
第6次使用fgets读一行后,文件指针位置在16处。
第6次读了2个字符,分别为ASCII码的十六进制表示:0x6e 0xa
第7次使用fgets读一行后,文件指针位置在17处。
第7次读了1个字符,分别为ASCII码的十六进制表示:0xa
图示