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[结束]