学习笔记2
- C语言文件操作内容知识点总结
- 运用ChatGPT进行苏格拉底挑战,发现问题与解决思路
- 实践过程截图
C语言文件操作内容知识点总结
- C语言文件基础操作
- 字符读写、行读写、任意位置读写
- 数据结构读写
- 结构化从文本文件操作
- 二进制文件与文本文件转换
C语言文件基础操作
1. 文件指针:
- C语言使用文件指针来管理文件操作。FILE 类型的指针用于表示文件对象。
- 常见的文件指针有
FILE *fp
;,其中fp
是一个指向文件的指针。
2. 文件读取:
- 使用
fscanf
、fgets
、fread
等函数从文件中读取数据。 - fscanf 用于按格式从文件中读取数据,而 fgets 用于逐行读取文本文件。
3. 文件写入:
- 使用
fprintf
、fputs
、fwrite
等函数将数据写入文件。 - fprintf 用于按格式写入数据到文件,而 fputs 用于写入字符串。
4. 文件的打开与关闭:
- 使用
fopen
函数打开文件,它需要指定文件名和打开模式(如读取、写入、追加等)。 - 使用
fclose
函数关闭文件,确保在程序结束前关闭文件以避免数据丢失。
5. 二进制文件与文本文件:
- C语言可以处理二进制文件和文本文件。
- 二进制文件包含原始数据,而文本文件包含可读的字符数据。
字符读写、行读写、任意位置读写
字符读写、行读写和任意位置读写是在文件操作中的不同读写模式,它们的区别主要在于读写的粒度和操作方式
1. 字符读写:
字符读取(Character Reading):以字符为单位进行读取,每次读取一个字符。
字符写入(Character Writing):以字符为单位进行写入,每次写入一个字符。
优点:适用于处理文本文件,可以逐字符地读取和写入文本内容。
缺点:频繁的字符读写可能会导致性能问题,因为每次读取或写入都需要文件系统的调用,比较慢。
2. 行读写:
行读取(Line Reading):以行为单位进行读取,每次读取一行文本。
行写入(Line Writing):以行为单位进行写入,每次写入一行文本。
优点:适用于处理文本文件中的逐行数据,例如日志文件或配置文件。较字符读写更高效,因为它减少了文件系统调用的次数。
缺点:无法直接处理二进制文件,因为它依赖于文本文件中的行分隔符(通常是换行符)。
3. 任意位置读写:
任意位置读取(Random Access Reading):可以在文件中指定的位置读取数据,而不必按顺序。任意位置写入(Random Access Writing):可以在文件中指定的位置写入数据,而不必按顺序。
优点:适用于处理二进制文件或需要在文件中定位到特定位置进行读写的情况。允许随机访问和修改文件中的数据。
缺点:操作稍微复杂,需要使用 fseek 定位文件指针到所需的位置。
数据结构读写
1. 写入数据结构到文件:
要将数据结构写入文件,通常需要按照数据结构的布局将数据逐个写入文件。
首先,打开文件以进行写入操作:
FILE *file = fopen("data.dat", "wb"); // 以二进制写入模式打开文件
if (file == NULL) {
perror("无法打开文件");
return 1;
}
然后,使用 fwrite 函数将数据结构写入文件。假设有一个学生结构体:
struct Student {
char name[50];
int age;
float grade;
};
struct Student student;
strcpy(student.name, "Alice");
student.age = 20;
student.grade = 85.5;
fwrite(&student, sizeof(struct Student), 1, file);
最后关闭文件:
FILE *file = fopen("data.dat", "rb"); // 以二进制读取模式打开文件
if (file == NULL) {
perror("无法打开文件");
return 1;
}
2. 从文件中读取数据结构:
要从文件中读取数据结构,首先需要打开文件以进行读取操作:
FILE *file = fopen("data.dat", "rb"); // 以二进制读取模式打开文件
if (file == NULL) {
perror("无法打开文件");
return 1;
}
然后,使用 fread 函数从文件中读取数据结构的内容:
struct Student student;
fread(&student, sizeof(struct Student), 1, file);
最后关闭文件。
结构化从文本文件操作
1. 定义结构体:
首先,需要定义一个结构体来表示你的数据结构。例如,如果要从文本文件中读取学生的信息,可以定义一个学生结构体如下:
struct Student {
char name[50];
int age;
float grade;
};
2. 打开文件:
使用 fopen 函数来打开要读取或写入的文本文件。需要指定文件名和打开模式(读取、写入、追加等):
FILE *file = fopen("students.txt", "r"); // 以只读模式打开文件
if (file == NULL) {
perror("无法打开文件");
return 1;
}
3. 读取数据:
使用文件操作函数(例如 fscanf 或 fgets)来从文本文件中读取数据并将其存储到结构体中:
struct Student student;
while (fscanf(file, "%s %d %f", student.name, &student.age, &student.grade) != EOF) {
// 处理读取到的数据,例如打印到屏幕
printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", student.name, student.age, student.grade);
}
4. 写入数据:
如果要将数据写入文本文件,可以使用 fprintf 函数。例将学生信息写入文件:
FILE *file = fopen("students.txt", "w"); // 以写入模式打开文件
if (file == NULL) {
perror("无法打开文件");
return 1;
}
struct Student student1 = {"Alice", 20, 85.5};
struct Student student2 = {"Bob", 22, 92.0};
fprintf(file, "%s %d %.2f\n", student1.name, student1.age, student1.grade);
fprintf(file, "%s %d %.2f\n", student2.name, student2.age, student2.grade);
fclose(file);
5. 关闭文件
二进制文件与文本文件转换
1. 从文本文件转换为二进制文件:
读取文本文件:首先,需要使用适当的文件读取方法(如fread 或 fgets)从文本文件中读取数据
解析文本数据:如果文本文件中的数据是结构化的(例如,CSV文件),则需要解析数据以将其转换为适当的数据结构,如结构体或数组。这通常涉及到分割文本行并将数据转换为相应的数据类型。
写入二进制文件:使用 fwrite 函数将解析后的数据写入到一个二进制文件中。确保指定正确的数据项大小和数量。
关闭文件:在完成转换后,关闭文件以释放资源。
例:
FILE *textFile = fopen("data.txt", "r");
FILE *binaryFile = fopen("data.bin", "wb");
if (textFile == NULL || binaryFile == NULL) {
perror("无法打开文件");
return 1;
}
char line[100];
while (fgets(line, sizeof(line), textFile) != NULL) {
// 解析数据并写入二进制文件
// ...
}
fclose(textFile);
fclose(binaryFile);
2. 从二进制文件转换为文本文件:
读取二进制文件:首先,使用 fread 函数从二进制文件中读取数据。确保知道数据的结构以正确地读取数据。
编码数据:将读取的二进制数据编码为文本格式。这通常涉及将数字或二进制数据转换为字符。
写入文本文件:使用 fprintf 或 fputs 函数将编码后的数据写入文本文件中。
关闭文件:在完成转换后,关闭文件以释放资源。
例:
FILE *binaryFile = fopen("data.bin", "rb");
FILE *textFile = fopen("data.txt", "w");
if (binaryFile == NULL || textFile == NULL) {
perror("无法打开文件");
return 1;
}
int value;
while (fread(&value, sizeof(int), 1, binaryFile) == 1) {
// 编码数据并写入文本文件
fprintf(textFile, "%d\n", value);
}
fclose(binaryFile);
fclose(textFile);