在 C 语言 中,我们除了可以使用 fgetc 函数按照每一个 字符 的方式来读取 文件,我们还可以使用 fgets 函数 按照 字符串 的形式来进行读取文件。
使用 fgets 函数读取文件时,读取到 n -1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。
char *fgets(char *str, int n, FILE *fp);
参数 | 描述 |
---|---|
str | 保存读取的内容的字符数组。 |
n | 要读取的字符数目。 |
fp | 文件指针。 |
读取成功时返回 字符数组 首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。
fgetc 函数在 stdio.h 的头文件里面。
读取到的字符串会在末尾自动添加 ‘\0’,n 个字符也包括 ‘\0’。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。
读取到 n -1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。
在 C 语言中,没有按行读取文件的函数,我们可以借助 fgets(),将 n 的值设置地足够大,每次就可以读取到一行数据。
使用 fopen 函数打开文件,使用 fgets 函数以字符串方式读文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
FILE *fp = NULL;
char str[100];
if ( (fp = fopen("c:\\1.txt", "r")) == NULL )
{
puts("Open file failed\n");
return;
}
else
{
puts("Open file success\n");
}
if (fgets(str, 100, fp) == NULL)
{
puts("Read file error\n");
}
else
{
printf("Read file success, str = %s\n", str);
}
printf("\n");
int ret = fclose(fp);
if (ret == 0)
{
puts("Close file success\n");
}
else
{
puts("Close file failed\n");
}
return 0;
}
程序运行后,控制台输出如下:
我们首先,使用了 fopen 函数,打开了一个 c 盘的文件,打开成功后,我们使用打开后返回的 FILE 指针,并调用 fgets 函数,来进行读取文件。
使用 fgets 函数按行的方式读取整个文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
FILE *fp = NULL;
char str[100];
if ( (fp = fopen("c:\\1.txt", "r")) == NULL )
{
puts("Open file failed\n");
return;
}
else
{
puts("Open file success\n");
}
while (fgets(str, 100, fp) != NULL)
{
printf("Read line = %s", str);
}
printf("\n");
int ret = fclose(fp);
if (ret == 0)
{
puts("Close file success\n");
}
else
{
puts("Close file failed\n");
}
return 0;
}
程序运行后,控制台输出如下:
我们在打开文件之后,使用了 while 循环 加上 fgets 函数实现了按行的方式读取了整个文件的内容,while 循环结束的条件就是 fgets 函数的返回值为 NULL。
使用 fgets 函数读取文件时,读取到 n -1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。