在C语言的学习和应用中,文件操作是一项极为重要的技能。它能够让程序与外部存储设备进行数据交互,实现数据的持久化存储和读取。今天,我们就围绕“C语言文件操作”展开深入探讨,对应图片中的8个重点内容,为大家带来全面且实用的讲解。
目录
一、为什么使用文件
在程序运行过程中,数据通常存储在内存里,一旦程序结束,这些数据就会丢失。而文件则可以将数据长期保存在外部存储介质(如硬盘)上,方便下次程序运行时读取,实现数据的持久化。比如,学生成绩管理系统中,学生的成绩信息需要长期保存,就可以通过文件操作来实现。此外,文件还能用于不同程序之间的数据共享,以及记录程序的运行日志等。
二、什么是文件
从操作系统的角度来看,文件是存储在外部存储设备上的一组相关数据的集合,有自己的文件名和存储路径。在C语言中,文件分为文本文件和二进制文件。文本文件以字符形式存储数据,每个字符对应一个ASCII码值;二进制文件则以二进制形式存储数据,与内存中数据的存储形式一致。
三、文件的打开和关闭
在C语言中,使用 fopen 函数打开文件, fclose 函数关闭文件。 fopen 函数的原型为:
c
FILE *fopen(const char *filename, const char *mode);
filename 是要打开的文件名(包含路径), mode 是文件的打开模式,如 "r" (只读)、 "w" (只写,会清空原有内容)、 "a" (追加)等。 fclose 函数原型为:
c
int fclose(FILE *stream);
stream 是 fopen 函数返回的文件指针。
示例代码:
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("test.txt", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
// 文件操作代码
fclose(fp);
return 0;
}
四、文件的顺序读写
顺序读写是按照文件中数据的存储顺序依次进行读取或写入操作。常见的函数有 fputc (写入一个字符)、 fgetc (读取一个字符)、 fputs (写入一个字符串)、 fgets (读取一个字符串)等。
示例代码(写入字符串):
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("test.txt", "w");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
fputs("Hello, C file operation!", fp);
fclose(fp);
return 0;
}
示例代码(读取字符串):
c
#include <stdio.h>
#define BUFFER_SIZE 100
int main() {
FILE *fp;
char buffer[BUFFER_SIZE];
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
fgets(buffer, BUFFER_SIZE, fp);
printf("%s", buffer);
fclose(fp);
return 0;
}
五、文件的随机读写
随机读写允许我们在文件的任意位置进行读取或写入操作,通过 fseek 函数来定位文件指针, ftell 函数获取文件指针当前位置, rewind 函数将文件指针复位到文件开头。 fseek 函数原型为:
c
int fseek(FILE *stream, long int offset, int origin);
stream 是文件指针, offset 是偏移量, origin 是起始位置( SEEK_SET 文件开头、 SEEK_CUR 当前位置、 SEEK_END 文件末尾)。
示例代码(定位到文件中间位置读取数据):
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
fseek(fp, 5, SEEK_SET); // 定位到第6个字符位置
char ch;
ch = fgetc(fp);
printf("%c\n", ch);
fclose(fp);
return 0;
}
六、文本文件和二进制文件
如前文所述,文本文件和二进制文件存储形式不同。文本文件便于人类阅读和编辑,但在存储数值等数据时可能会有转换损耗;二进制文件存储效率高,能准确存储各种数据类型,但不便于直接查看内容。以存储整数 100 为例:
c
#include <stdio.h>
int main() {
// 写入文本文件
FILE *text_fp = fopen("text.txt", "w");
if (text_fp == NULL) {
perror("文本文件打开失败");
return 1;
}
fprintf(text_fp, "%d", 100);
fclose(text_fp);// 写入二进制文件
FILE *bin_fp = fopen("bin.bin", "wb");
if (bin_fp == NULL) {
perror("二进制文件打开失败");
return 1;
}
int num = 100;
fwrite(&num, sizeof(int), 1, bin_fp);
fclose(bin_fp);return 0;
}
七、文件读取结束的判定
常用的判定方法有:对于文本文件,使用 feof 函数判断是否到达文件末尾,当 feof 函数返回非零值时表示到达文件末尾;对于二进制文件,通过 fread 等函数的返回值来判断读取是否结束,若返回值小于要读取的元素个数,则表示读取结束。
示例代码(文本文件):
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
fclose(fp);
return 0;
}
八、文件缓冲区
为了提高文件读写效率,C语言为每个打开的文件都设置了一个缓冲区。在写入文件时,数据先写入缓冲区,当缓冲区满或文件关闭时,数据才真正写入外部存储设备;读取文件时,数据先从外部存储设备读取到缓冲区,然后再从缓冲区读取到程序变量中。可以使用 fflush 函数来强制刷新缓冲区,将缓冲区中的数据立即写入文件。
c
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("test.txt", "w");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
fputs("立即写入数据", fp);
fflush(fp); // 强制刷新缓冲区
fclose(fp);
return 0;
}
通过对以上C语言文件操作重点内容的详细讲解和示例代码演示,相信大家对C语言文件操作有了更深入的理解和掌握。在实际编程中,合理运用这些知识,能让我们的程序更加完善和强大。