目录:
- 一、为什么使用文件?
- 二、什么是文件?
- 三、文件的打开和关闭
-
- [1. 文件指针](#1. 文件指针)
- [2. 文件的打开和关闭](#2. 文件的打开和关闭)
- 四、文件的顺序读写
- 五、fseek函数
- 六、ftell函数
- 七、rewind函数
- 八、文本文件和二进制文件
- 九、文件读取结束的判定
- 十、文件缓冲区
- 文件函数的参数和使用方法
-
- [1. `fopen` 函数](#1.
fopen函数) - [2. `fclose` 函数](#2.
fclose函数) - [3. `fprintf` 函数](#3.
fprintf函数) - [4. `fscanf` 函数](#4.
fscanf函数) - [5. `fgets` 函数](#5.
fgets函数) - [6. `fputs` 函数](#6.
fputs函数) - [7. `fseek` 函数](#7.
fseek函数) - [8. `ftell` 函数](#8.
ftell函数) - [9. `rewind` 函数](#9.
rewind函数) - [10. `fwrite` 函数](#10.
fwrite函数) - [11. `fread` 函数](#11.
fread函数) - [12. `feof` 函数](#12.
feof函数) - [13. `setvbuf` 函数](#13.
setvbuf函数)
- [1. `fopen` 函数](#1.
- 总结
一、为什么使用文件?
在编程中,文件操作是不可或缺的一部分。文件可以用于持久化存储数据,使得数据在程序运行结束后仍然可以被保存和读取。无论是配置文件、日志文件还是用户数据,文件操作都为我们提供了灵活且强大的数据管理方式。(以下代码有什么文件函数不懂的,下面有详细的讲解)
二、什么是文件?
文件是存储在外部存储介质(如硬盘、U盘等)上的一组相关数据的集合。在C语言中,文件可以分为以下几类:
- 程序文件 :包含程序源代码的文件,如
.c文件。 - 数据文件:用于存储程序运行时产生的数据,如日志文件、配置文件等。
- 文件名 :文件的唯一标识符,通常由文件名和扩展名组成,如
data.txt。
三、文件的打开和关闭
1. 文件指针
在C语言中,文件操作通过文件指针(FILE*)进行。文件指针是一个指向文件结构体的指针,用于管理文件的读写操作。
c
FILE *fp;
2. 文件的打开和关闭
文件的打开和关闭是文件操作的基本步骤。使用 fopen 函数打开文件,使用 fclose 函数关闭文件。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "w"); // 以写入模式打开文件
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
// 文件操作
fclose(fp); // 关闭文件
return 0;
}
四、文件的顺序读写
文件的顺序读写是指按照文件内容的顺序进行读取或写入操作。常用的函数包括 fprintf、fscanf、fgets 和 fputs。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
fprintf(fp, "Hello, World!\n"); // 写入文件
fclose(fp);
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
char buffer[100];
fgets(buffer, 100, fp); // 读取文件
printf("%s", buffer);
fclose(fp);
return 0;
}
五、fseek函数
fseek 函数用于移动文件指针到指定位置。它常用于随机访问文件内容。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "w+");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
fprintf(fp, "Hello, World!\n");
fseek(fp, 0, SEEK_SET); // 将文件指针移动到文件开头
char buffer[100];
fgets(buffer, 100, fp);
printf("%s", buffer);
fclose(fp);
return 0;
}
六、ftell函数
ftell 函数用于获取当前文件指针的位置。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "w+");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
fprintf(fp, "Hello, World!\n");
long pos = ftell(fp); // 获取当前文件指针位置
printf("当前文件指针位置: %ld\n", pos);
fclose(fp);
return 0;
}
七、rewind函数
rewind 函数用于将文件指针重置到文件开头。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "w+");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
fprintf(fp, "Hello, World!\n");
rewind(fp); // 将文件指针重置到文件开头
char buffer[100];
fgets(buffer, 100, fp);
printf("%s", buffer);
fclose(fp);
return 0;
}
八、文本文件和二进制文件
C语言支持两种文件类型:文本文件和二进制文件。文本文件以字符形式存储数据,而二进制文件以二进制形式存储数据。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.bin", "wb"); // 以二进制写入模式打开文件
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
int data = 12345;
fwrite(&data, sizeof(int), 1, fp); // 写入二进制数据
fclose(fp);
fp = fopen("example.bin", "rb"); // 以二进制读取模式打开文件
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
int read_data;
fread(&read_data, sizeof(int), 1, fp); // 读取二进制数据
printf("读取的数据: %d\n", read_data);
fclose(fp);
return 0;
}
九、文件读取结束的判定
在文件读取过程中,使用 feof 函数判断文件是否读取结束。需要注意的是,feof 函数在文件读取结束时返回非零值,但在读取错误时也会返回非零值。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
char buffer[100];
while (fgets(buffer, 100, fp) != NULL) {
printf("%s", buffer);
}
if (feof(fp)) {
printf("文件读取结束\n");
} else {
printf("文件读取错误\n");
}
fclose(fp);
return 0;
}
十、文件缓冲区
文件缓冲区是操作系统用于提高文件读写效率的一种机制。C语言提供了 setvbuf 函数来设置文件缓冲区。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
char buffer[1024];
setvbuf(fp, buffer, _IOFBF, 1024); // 设置文件缓冲区
fprintf(fp, "Hello, World!\n");
fclose(fp);
return 0;
}
文件函数的参数和使用方法
1. fopen 函数
c
FILE *fopen(const char *filename, const char *mode);
filename:文件名,可以是相对路径或绝对路径。mode:文件打开模式,如"r"(只读)、"w"(写入,文件不存在则创建)、"a"(追加)等。
2. fclose 函数
c
int fclose(FILE *stream);
stream:文件指针。
3. fprintf 函数
c
int fprintf(FILE *stream, const char *format, ...);
stream:文件指针。format:格式化字符串。...:可变参数列表。
4. fscanf 函数
c
int fscanf(FILE *stream, const char *format, ...);
stream:文件指针。format:格式化字符串。...:可变参数列表。
5. fgets 函数
c
char *fgets(char *str, int n, FILE *stream);
str:存储读取内容的字符串。n:最大读取字符数。stream:文件指针。
6. fputs 函数
c
int fputs(const char *str, FILE *stream);
str:要写入的字符串。stream:文件指针。
7. fseek 函数
c
int fseek(FILE *stream, long offset, int origin);
stream:文件指针。offset:偏移量。origin:起始位置,如SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。
8. ftell 函数
c
long ftell(FILE *stream);
stream:文件指针。
9. rewind 函数
c
void rewind(FILE *stream);
stream:文件指针。
10. fwrite 函数
c
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:要写入的数据指针。size:每个数据项的大小。nmemb:数据项的数量。stream:文件指针。
11. fread 函数
c
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:存储读取数据的指针。size:每个数据项的大小。nmemb:数据项的数量。stream:文件指针。
12. feof 函数
c
int feof(FILE *stream);
stream:文件指针。
13. setvbuf 函数
c
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
stream:文件指针。buf:缓冲区指针。mode:缓冲模式,如_IOFBF(全缓冲)、_IOLBF(行缓冲)、_IONBF(无缓冲)。size:缓冲区大小。
总结
C语言的文件操作提供了丰富的功能,从文件的打开和关闭到文件的读写,再到文件指针的移动和缓冲区的设置,每一步都为程序员提供了灵活且强大的工具。通过深入理解这些操作,我们可以更好地管理和处理文件数据,从而提高程序的效率和可靠性。此时,我们的C语言之旅就到此结束了,大家可以持续关注数据结构等专栏。