C语言字符串方式读文件

C语言字符串方式读文件教程

C 语言 中,我们除了可以使用 fgetc 函数按照每一个 字符 的方式来读取 文件,我们还可以使用 fgets 函数 按照 字符串 的形式来进行读取文件。

使用 fgets 函数读取文件时,读取到 n -1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。

C语言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; }

程序运行后,控制台输出如下:

11_c语言fgets读取文件.png

我们首先,使用了 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; }

程序运行后,控制台输出如下:

12_c语言fgets读取文件.png

我们在打开文件之后,使用了 while 循环 加上 fgets 函数实现了按行的方式读取了整个文件的内容,while 循环结束的条件就是 fgets 函数的返回值为 NULL。

C语言字符串方式读文件总结

使用 fgets 函数读取文件时,读取到 n -1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。