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