在 C 语言中,文件操作是非常重要的一部分,通过文件读写,程序可以保存数据到磁盘或从磁盘读取数据。C 标准库提供了多种函数和方法来处理文件,本文将详细介绍文件的打开和关闭、文件读写操作,包括文本文件和二进制文件的处理方式。
fopen
fclose
fgetc
fgets
fputc
fputs
fprintf
和 fscanf
fread
fwrite
ftell
fseek
rewind
ferror
feof
在进行文件操作时,首先需要通过 fopen
函数打开文件,操作完成后通过 fclose
函数关闭文件。
fopen
fopen
用于打开文件,返回指向 FILE
类型的指针。如果打开失败,返回 NULL
。
FILE *fopen(const char *filename, const char *mode);
filename
:要打开的文件名。mode
:文件的打开模式,包括以下几种常见模式:
"r"
:以只读方式打开文件,文件必须存在。"w"
:以写入方式打开文件,若文件存在则清空其内容,若文件不存在则创建文件。"a"
:以追加模式打开文件,若文件不存在则创建文件,所有写入内容都追加到文件末尾。"r+"
:以读写方式打开文件,文件必须存在。"w+"
:以读写方式打开文件,若文件存在则清空其内容,若文件不存在则创建文件。"a+"
:以读写方式打开文件,若文件不存在则创建文件,写入内容总是追加到文件末尾。#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 文件操作...
fclose(file);
return 0;
}
fclose
fclose
函数用于关闭文件,释放与文件关联的资源。
int fclose(FILE *stream);
FILE *file = fopen("example.txt", "r");
if (file != NULL) {
// 文件操作...
fclose(file);
}
文件的读写操作根据文件类型分为文本文件和二进制文件两类。
fgetc
fgetc
用于从文件中读取单个字符。
int fgetc(FILE *stream);
int
类型),若到达文件末尾则返回 EOF
。#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
int ch;
while ((ch = fgetc(file)) != EOF) {
putchar(ch); // 输出字符
}
fclose(file);
return 0;
}
fgets
fgets
用于从文件中读取一行文本。
char *fgets(char *str, int n, FILE *stream);
str
:存储读取内容的字符串指针。n
:最多读取 n-1
个字符(最后一个字符留给 \0
)。str
,若到达文件末尾或发生错误返回 NULL
。#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer); // 输出行
}
fclose(file);
return 0;
}
fputc
fputc
用于将字符写入文件。
int fputc(int char, FILE *stream);
EOF
。#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
fputc('A', file); // 写入字符 A
fputc('\n', file); // 写入换行符
fclose(file);
return 0;
}
fputs
fputs
用于将字符串写入文件。
int fputs(const char *str, FILE *stream);
EOF
。#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
fputs("Hello, World!\n", file); // 写入字符串
fclose(file);
return 0;
}
fprintf
和 fscanf
fprintf
和 fscanf
是格式化输出和输入函数,类似于 printf
和 scanf
,但用于文件操作。
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
fprintf
和 fscanf
#include <stdio.h>
int main() {
FILE *file = fopen("data.txt", "w");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
fprintf(file, "姓名: %s 年龄: %d\n", "Alice", 25); // 写入格式化数据
fclose(file);
// 读取文件
file = fopen("data.txt", "r");
if (file != NULL) {
char name[20];
int age;
fscanf(file, "姓名: %s 年龄: %d", name, &age); // 读取格式化数据
printf("姓名: %s, 年龄: %d\n", name, age);
fclose(file);
}
return 0;
}
与文本文件不同,二进制文件直接处理原始字节,读写不涉及编码转换。
fread
fread
用于从二进制文件中读取数据。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr
:数据存储的缓冲区指针。size
:每个数据块的大小(字节数)。nmemb
:要读取的数据块数量。fwrite
fwrite
用于向二进制文件写入数据。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr
:要写入的数据指针。size
:每个数据块的大小。nmemb
:要写入的数据块数量。#include <stdio.h>
struct Person {
char name[20];
int age;
};
int main() {
FILE *file = fopen("people.dat", "wb");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
struct Person p1 = {"Alice", 25};
fwrite(&p1, sizeof(struct Person), 1, file); // 写入二进制数据
fclose(file);
// 读取二进制文件
file = fopen("people.dat", "rb");
if (file != NULL) {
struct Person p2;
fread(&p2, sizeof(struct Person), 1, file); // 读取二进制数据
printf("姓名: %s, 年龄: %d\n
", p2.name, p2.age);
fclose(file);
}
return 0;
}
ftell
ftell
返回文件指针当前位置的偏移量。
long ftell(FILE *stream);
fseek
fseek
设置文件指针位置。
int fseek(FILE *stream, long offset, int whence);
offset
:相对位置偏移量。whence
:参考位置(SEEK_SET
、SEEK_CUR
、SEEK_END
)。rewind
rewind
将文件指针重置为文件开头。
void rewind(FILE *stream);
ferror
ferror
函数用于检查文件流是否有错误。
int ferror(FILE *stream);
feof
feof
函数用于检查文件是否到达末尾。
int feof(FILE *stream);
FILE *file = fopen("example.txt", "r");
if (file != NULL) {
while (!feof(file)) {
// 文件操作...
}
fclose(file);
}
通过以上操作,C 语言中的文件处理能力得到了系统性的展示,不论是文本文件还是二进制文件,都可以通过上述方法实现灵活的读写操作。