C语言中的文件操作是程序设计中非常重要的一个部分,它允许程序员读取、写入和管理存储在磁盘上的数据。本文将详细介绍C语言中的文件操作,包括文件的打开、关闭、读取、写入以及错误处理等关键概念,并通过代码示例帮助读者更好地理解这些技术。
在C语言中,文件被视为一系列字节的集合,可以是文本文件或二进制文件。文件操作的核心函数位于标准库<stdio.h>中。主要涉及以下几个方面:
文件指针是一个指向FILE结构体的指针,定义如下:
FILE *fp;
通过文件指针可以访问和操作文件。
常见的文件模式有以下几种:
"r":只读模式,文件必须存在。"w":只写模式,如果文件不存在则创建;如果存在则清空内容。"a":追加模式,如果文件不存在则创建;如果存在则在末尾添加内容。"rb", "wb", "ab":分别对应以二进制方式打开文件进行读取、写入和追加。"r+", "w+", "a+":分别表示可读可写的模式。使用fopen函数打开文件:
FILE *fopen(const char *filename, const char *mode);
示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
使用fclose函数关闭文件:
int fclose(FILE *stream);
示例:
fclose(fp);
使用fgetc逐字符读取,或者使用fgets逐行读取:
int fgetc(FILE *stream);
char *fgets(char *str, int n, FILE *stream);
示例:
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
使用fputc逐字符写入,或者使用fprintf格式化写入:
int fputc(int c, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
示例:
fputc('A', fp);
fprintf(fp, "Hello, World!\n");
使用fseek设置文件指针的位置,ftell获取当前文件指针位置:
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
示例:
fseek(fp, 0, SEEK_END); // 移动到文件末尾
long size = ftell(fp); // 获取文件大小
在文件操作过程中,可能会遇到错误,例如文件无法打开、读写失败等。可以通过检查返回值和使用perror来处理错误:
if (fopen("nonexistent.txt", "r") == NULL) {
perror("File error");
}
以下是一个完整的示例程序,演示如何创建、写入和读取文件:
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "w+");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
// 写入文件
fprintf(fp, "Hello, World!\n");
// 返回到文件开头
fseek(fp, 0, SEEK_SET);
// 读取文件并打印到屏幕
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
以下是文件操作的主要流程图,展示了从打开文件到关闭文件的整个过程:
graph TD
A[开始] --> B[打开文件]
B -->|成功| C[执行文件操作]
B -->|失败| D[输出错误信息]
C --> E[关闭文件]
E --> F[结束]