1.fgetc
对单个字符的读操作,只能操作文本文件。
1)头文件
#include <stdio.h>
2)函数原型
int fgetc(FILE *stream);
3)参数
stream:目标文件的文件指针。
4)返回值
若读取成功,返回读取到的字符,若失败或者到达文件末尾,返回EOF(-1)。
5)示例:(以只读方法打开ftest文件,单字节读取内容并打印)
| #include <stdio.h>
int main() { FILE *fp = fopen("ftest", "r"); //读文件测试,以只读方式打开前面创建的ftest文件 if (!fp) { printf("error: ftest openn"); return -1; } int fgc = fgetc(fp); if (fgc == EOF) { printf("error: ftest fgetcn"); return -1; } printf("%cn", (char)fgc); //由于fgetc是int型返回,字符内容需要强制转换成char return 0; } |
6)编译运行并查看测试结果
| H |
2.fgets
对一行字符的读操作(一行的概念是至多包含一个换行符),只能操作文本文件。当读取(n-1)个字符,或者读取到换行符,或者到达文件末尾时,它会停止。
1)头文件
#include <stdio.h>
2)函数原型
char *fgets(char *ptr, int size, FILE*stream);
3)参数
ptr:指向字符数组的指针,用于存储从文件中读取的字符串。
size:要读取的最大字符数,超过 *ptr字符数组的大小会导致内存越界。
stream:要读取的文件指针。
4)返回值
若读取成功,返回指向缓存区(存放读取到的内容)的指针,若失败或者到达文件末尾,返回NULL。 5)示例:(以只读方法打开ftest文件,循环读取完整内容并打印)
| #include <stdio.h>
int main() { char buf[6]; FILE *fp = fopen("ftest", "r"); if (!fp) { printf("error: ftest openn"); return -1; } while (fgets(buf, 6, fp)) { //while循环读取,如果实际文件长度较长,是有必要的 printf("ftest fgets: %sn", buf); } return 0; } |
6)编译运行并查看测试结果
| ftest fgets: HELLO
ftest fgets: WORL ftest fgets: D!!! //ftest文件内容最后是换行符,所以这里有一次换行 //这里的空白是printf打印中使用了“n”换行 |
3.fread
按块以二进制数据格式从文件中读取若干数据。虽然可以操作二进制或者文本文件,但读取文本文件需要注意换行符之类的文本字符。
1)头文件
#include <stdio.h>
2)函数原型
size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream);
3)参数
buf:指向读取后存放数据的缓冲区。
size:要读取的每个块的大小,以字节为单位。
nmemb:要读取块的个数,每个块的大小为 size 字节。
stream:要读取的文件指针。
4)返回值
返回读取的块数量,若等于nmemb,表示读取成功;若返回值小于nmemb,表示出错或者到达文件末尾。
5)示例:(以只读方法打开ftest文件,循环读取完整内容并打印)
| #include <stdio.h>
int main() { char buf[6]; FILE *fp = fopen("ftest", "r"); if (!fp) { printf("error: ftest openn"); return -1; } while (1) { if (fread(buf, sizeof(char), 6, fp) < 6) { //读取到文件末尾,则停止循环 printf("ftest fgets: %sn", buf); break; } printf("ftest fgets: %sn", buf); } return 0; } |
6)编译运行并查看测试结果
| ftest fgets: HELLO
ftest fgets: WORLD! ftest fgets: !! LD! //此处是由于buf[3]-buf[5]的内容并未更新(是第二次读取的内容),第三次读取只有三个字符“!”、"!"、“n”,只更新了buf[0]-buf[2] |
606