- c语言学习计划
- C语言简介
- C语言基本语法
- C语言-控制结构
- C语言-输入输出
- C语言-数组和字符串
- C语言函数详解
- C语言指针详解
- 结构体和联合体
- C语言高级特性和内存管理
- c语言文件操作
- C 语言标准库
- C 语言标准库(二)
- C 语言标准库(三)
- C 语言标准库(四)
- C 语言标准库(五)
c语言文件操作
class fopen,fwrite在 C 语言中,文件操作是非常重要的一部分,通过文件读写,程序可以保存数据到磁盘或从磁盘读取数据。C 标准库提供了多种函数和方法来处理文件,本文将详细介绍文件的打开和关闭、文件读写操作,包括文本文件和二进制文件的处理方式。
目录
- 文件的打开与关闭
fopenfclose
- 文件的读写操作
- 文本文件操作
fgetcfgetsfputcfputsfprintf和fscanf
- 二进制文件操作
freadfwrite
- 文本文件操作
- 文件的定位与指针操作
ftellfseekrewind
- 文件错误处理
ferrorfeof
1. 文件的打开与关闭
在进行文件操作时,首先需要通过 fopen 函数打开文件,操作完成后通过 fclose 函数关闭文件。
1.1 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;
}
1.2 fclose
fclose 函数用于关闭文件,释放与文件关联的资源。
int fclose(FILE *stream);
示例:关闭文件
FILE *file = fopen("example.txt", "r");
if (file != NULL) {
// 文件操作...
fclose(file);
}
2. 文件的读写操作
文件的读写操作根据文件类型分为文本文件和二进制文件两类。
2.1 文本文件操作
2.1.1 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;
}
2.1.2 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;
}
2.1.3 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;
}
2.1.4 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;
}
2.1.5 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;
}
2.2 二进制文件操作
与文本文件不同,二进制文件直接处理原始字节,读写不涉及编码转换。
2.2.1 fread
fread 用于从二进制文件中读取数据。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:数据存储的缓冲区指针。size:每个数据块的大小(字节数)。nmemb:要读取的数据块数量。- 返回值:实际读取的块数。
2.2.2 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;
}
3. 文件的定位与指针操作
3.1 ftell
ftell 返回文件指针当前位置的偏移量。
long ftell(FILE *stream);
3.2 fseek
fseek 设置文件指针位置。
int fseek(FILE *stream, long offset, int whence);
offset:相对位置偏移量。whence:参考位置(SEEK_SET、SEEK_CUR、SEEK_END)。
3.3 rewind
rewind 将文件指针重置为文件开头。
void rewind(FILE *stream);
4. 文件错误处理
4.1 ferror
ferror 函数用于检查文件流是否有错误。
int ferror(FILE *stream);
4.2 feof
feof 函数用于检查文件是否到达末尾。
int feof(FILE *stream);
示例:检测文件末尾
FILE *file = fopen("example.txt", "r");
if (file != NULL) {
while (!feof(file)) {
// 文件操作...
}
fclose(file);
}
通过以上操作,C 语言中的文件处理能力得到了系统性的展示,不论是文本文件还是二进制文件,都可以通过上述方法实现灵活的读写操作。
评论区
评论列表