(10)文件操作
1. 文件指针的概念和定义
在 C 语言中,文件指针是一种特殊的指针,用于指向一个文件结构体。这个结构体包含了文件的各种信息,如文件名、文件状态、当前文件位置指针等。通过文件指针,程序可以对文件进行各种操作。
文件指针的定义形式如下:
FILE *fp;
这里FILE
是一个在<stdio.h>
头文件中定义的结构体类型,fp
就是我们定义的文件指针变量。
2. 文件的打开方法、文件打开函数返回值的处理
文件打开函数 - fopen()
在 C 语言中,使用fopen()
函数来打开文件。其基本语法如下:
FILE *fopen(const char *filename, const char *mode);
filename
是要打开的文件的名称(包括路径,如果文件不在当前目录下)。例如:"data.txt"
或者"C:/myfiles/data.bin"
。mode
是打开文件的模式,不同的模式决定了文件的操作方式,常见的模式如下:- 文本文件模式:
"r"
:以只读方式打开文件,文件必须存在。"w"
:以只写方式打开文件,如果文件存在则清空内容,如果文件不存在则创建新文件。"a"
:以追加方式打开文件,在文件末尾添加内容,如果文件不存在则创建新文件。"r+"
:以读写方式打开文件,文件必须存在。"w+"
:以读写方式打开文件,先清空文件内容(如果存在)或创建新文件。"a+"
:以读写方式打开文件,追加模式,文件不存在则创建。
- 二进制文件模式:在上述模式字符串后添加
"b"
,如"rb"
、"wb"
、"ab"
等,表示以二进制方式操作文件。
- 文本文件模式:
文件打开函数返回值的处理
fopen()
函数返回一个FILE *
类型的指针,如果成功打开文件,则返回指向该文件的指针;如果打开文件失败,则返回NULL
。因此,在打开文件后,应该检查返回值,以确保文件打开成功。例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
// 文件操作...
fclose(fp);
return 0;
}
在这个示例中,如果fopen()
返回NULL
,使用perror()
函数输出错误信息,并返回EXIT_FAILURE
表示程序执行失败。
3. 在程序中读写外部的文本文件或者二进制文件的方法
文本文件的读写
- 读文本文件 -
fgets()
和fscanf()
函数fgets()
函数:用于从文件中读取一行字符串。其语法如下:
char *fgets(char *str, int n, FILE *stream);
str
是存储读取字符串的字符数组,n
是最多读取的字符数(包括'\0'
),stream
是文件指针。例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("text.txt", "r");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
char line[100];
while (fgets(line, 100, fp)!= NULL) {
printf("%s", line);
}
fclose(fp);
return 0;
}
- **`fscanf()`函数**:类似于`scanf()`,但用于从文件中读取格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>
struct Student {
char name[20];
int age;
};
int main() {
FILE *fp = fopen("students.txt", "r");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
struct Student student;
while (fscanf(fp, "%s %d", student.name, &student.age)!= -1) {
printf("姓名: %s, 年龄: %d\n", student.name, student.age);
}
fclose(fp);
return 0;
}
- 写文本文件 -
fputs()
和fprintf()
函数fputs()
函数:用于向文件中写入一个字符串(不自动添加'\0'
)。其语法如下:
int fputs(const char *str, FILE *stream);
例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("output.txt", "w");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
char str[] = "这是要写入文件的内容";
fputs(str, fp);
fclose(fp);
return 0;
}
- **`fprintf()`函数**:类似于`printf()`,但用于向文件中写入格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>
struct Student {
char name[20];
int age;
};
int main() {
FILE *fp = fopen("students_info.txt", "w");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
struct Student student = {"张三", 20};
fprintf(fp, "姓名: %s, 年龄: %d\n", student.name, student.age);
fclose(fp);
return 0;
}
二进制文件的读写
- 读二进制文件 -
fread()
函数
fread()
函数用于从文件中读取二进制数据。其语法如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
ptr
是存储读取数据的内存地址,size
是每个数据元素的大小,count
是要读取的元素个数,stream
是文件指针。例如,读取一个包含整数的二进制文件:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("data.bin", "rb");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
int buffer[10];
size_t elements_read = fread(buffer, sizeof(int), 10, fp);
printf("成功读取 %zu 个整数\n", elements_read);
for (int i = 0; i < elements_read; i++) {
printf("%d ", buffer[i]);
}
fclose(fp);
return 0;
}
- 写二进制文件 -
fwrite()
函数
fwrite()
函数用于向文件中写入二进制数据。其语法如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
例如,将一个整数数组写入二进制文件:
#include <stdio.h>
#include <stdlib.h>
int main() {
int data[] = {1, 2, 3, 4, 5};
FILE *fp = fopen("output.bin", "wb");
if (fp == NULL) {
perror("打开文件失败");
return EXIT_FAILURE;
}
size_t elements_written = fwrite(data, sizeof(int), 5, fp);
printf("成功写入 %zu 个整数\n", elements_written);
fclose(fp);
return 0;
}
通过上述方法,可以在 C 程序中方便地对文本文件和二进制文件进行读写操作,实现数据的存储和读取。同时,注意在操作完文件后,使用fclose()
函数关闭文件,释放相关资源。