C语言提供了丰富的文件操作函数,用于实现文件的打开、关闭、读写等操作。以下是常见文件操作函数的详细说明及示例:
一、文件的打开和关闭1. 文件指针- FILE结构体:每个打开的文件在内存中对应一个FILE结构体变量,存储文件名、状态、位置等信息。
- 文件指针:通过FILE*指针维护该结构体,方便操作文件。
2. 文件打开和关闭二、文件的顺序读写1. 字符读写:fgetc() 和 fputc()- fgetc:读取一个字符,到达文件末尾或失败时返回EOF。int ch = fgetc(fp);
- fputc:写入一个字符,返回写入的字符,失败时返回EOF。fputc('A', fp); // 写入字符'A'
2. 字符串读写:fgets() 和 fputs()- fgets:读取一行字符串(最多n-1个字符,遇到n停止)。char buf[100];fgets(buf, sizeof(buf), fp); // 读取一行到buf
- fputs:写入字符串(不自动添加n)。fputs("Hellon", fp); // 写入字符串
3. 格式化读写:fscanf() 和 fprintf()- fscanf:从文件格式化读取数据。int num;fscanf(fp, "%d", &num); // 读取整数
- fprintf:格式化写入数据。fprintf(fp, "%d %s", 10, "abc"); // 写入格式化数据
4. 二进制读写:fread() 和 fwrite()- fread:读取二进制数据。size_t fread(void *buf, size_t size, size_t count, FILE *fp);
示例:
int arr[5];fread(arr, sizeof(int), 5, fp); // 读取5个整数 - fwrite:写入二进制数据。size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp);
示例:
int arr[3] = {1, 2, 3};fwrite(arr, sizeof(int), 3, fp); // 写入3个整数
三、文件的随机读写1. fseek():移动文件指针int fseek(FILE *fp, long offset, int whence);- whence:
SEEK_SET(0):文件开头。
SEEK_CUR(1):当前位置。
SEEK_END(2):文件末尾。
- 示例:fseek(fp, 10, SEEK_SET); // 指针移动到距开头10字节处
2. ftell():获取指针位置long ftell(FILE *fp);3. rewind():重置指针到文件开头void rewind(FILE *fp);四、文本文件与二进制文件- 文本文件:以ASCII字符存储(如.txt),可读性强。
- 二进制文件:直接存储内存数据(如.dat),效率高但不可读。
五、文件读取结束的判定1. feof():检测文件末尾int feof(FILE *fp);2. ferror():检测文件错误int ferror(FILE *fp);3. 判断方式- 文本文件:
fgetc:检查是否为EOF。
fgets:检查返回值是否为NULL。
- 二进制文件:
fread:检查返回值是否小于请求的项数。
六、文件缓冲区- 作用:数据先写入内存缓冲区,满后再写入磁盘,提高效率。
- 刷新缓冲区:
fflush:强制刷新缓冲区。
int fflush(FILE *fp);fclose:关闭文件时自动刷新。
示例代码#include <stdio.h>int main() { // 1. 打开文件 FILE *fp = fopen("example.txt", "w+"); if (fp == NULL) { perror("文件打开失败"); return 1; } // 2. 写入数据 fprintf(fp, "Hello, World!n"); fputs("This is a test.n", fp); // 3. 读取数据 rewind(fp); // 重置指针到开头 char buf[100]; while (fgets(buf, sizeof(buf), fp) != NULL) { printf("%s", buf); } // 4. 关闭文件 fclose(fp); return 0;}总结- 打开/关闭:fopen、fclose。
- 顺序读写:字符(fgetc/fputc)、字符串(fgets/fputs)、格式化(fscanf/fprintf)、二进制(fread/fwrite)。
- 随机读写:fseek、ftell、rewind。
- 结束判定:feof、ferror。
- 缓冲区:fflush刷新。
掌握这些函数后,可以高效地操作文件数据。