这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业
这个作业的目标 复习巩固前面所学的内容
作业正文 https://www.cnblogs.com/118qa/p/18608015
教材学习内容总结
一、文件的基本概念
文件是存储在外部介质(如磁盘)上的数据集合,可以把它看作是程序与外部存储设备之间进行数据传输的桥梁。在 C 语言中,文件分为文本文件(以 ASCII 码形式存储字符,便于阅读)和二进制文件(以二进制形式存储数据,更紧凑高效)。
二、文件指针
定义:文件指针是指向一个结构体类型(FILE 类型)的指针变量,用于标识文件在内存中的相关信息以及操作文件的位置等。例如:FILE *fp;就定义了一个名为 fp 的文件指针。
作用:通过文件指针来操作文件,调用相关函数实现诸如打开、读写、关闭文件等操作,它就像是操控文件的一个把手。
三、文件的打开与关闭
打开文件:使用fopen函数来打开文件,其一般格式为FILE *fp = fopen("文件名", "文件使用方式");。“文件名” 要包含完整路径(若在当前目录可直接写文件名),“文件使用方式” 常见的有 “r”(只读方式打开文本文件)、“w”(只写方式打开文本文件,若文件存在则清空内容,不存在则创建)、“a”(追加方式打开文本文件,在文件末尾添加内容)、“rb”“wb”“ab”(对应二进制文件的读、写、追加操作)等。例如:FILE *fp = fopen("test.txt", "r");就是以只读方式打开当前目录下名为 “test.txt” 的文本文件。
关闭文件:当文件使用完毕后,务必用fclose函数关闭文件,格式为fclose(fp);(fp 为已打开文件的文件指针)。及时关闭文件可以避免数据丢失、释放相关系统资源等。
四、文件的读写操作
字符读写:
读字符:使用fgetc函数从指定文件中读取一个字符,例如char ch = fgetc(fp);(fp 为已打开的文件指针),它会返回读取到的字符,若读到文件末尾则返回EOF(值为 -1)。
写字符:通过fputc函数向文件写入一个字符,比如fputc('A', fp); 会把字符‘A’写入到由 fp 指向的文件中。
字符串读写:
读字符串:fgets函数用于从文件中读取一行字符串(遇到换行符或文件末尾或读取了指定长度 - 1 个字符就停止),其格式一般为char *fgets(char *s, int n, FILE *fp);,s 是存放读取字符串的字符数组,n 是最多读取的字符个数,fp 为文件指针。例如:char str[100]; fgets(str, 100, fp);。
写字符串:fputs函数可将字符串写入文件,格式如fputs("Hello", fp);,会把 “Hello” 字符串(不包含字符串结束标志‘\0’)写入到 fp 指向的文件中。
格式化读写:
读格式化数据:类似scanf函数的功能,不过针对文件操作,fscanf函数按照指定格式从文件中读取数据,例如fscanf(fp, "%d %s", &num, name);从 fp 指向的文件中按格式读取一个整数和一个字符串分别存入 num 变量和 name 字符数组中。
写格式化数据:与printf函数对应,fprintf函数按照给定格式将数据写入文件,比如fprintf(fp, "%d %s", 10, "test");会把整数 10 和字符串 “test” 按格式写入 fp 指向的文件中。
数据块读写:
读数据块:fread函数用于从文件中读取一块数据,格式为size_t fread(void *ptr, size_t size, size_t count, FILE *fp);,ptr 是存放读取数据的内存地址,size 是每个数据项的字节大小,count 是要读取的数据项个数,fp 是文件指针。例如读取一个结构体数组的数据可以这样操作。
写数据块:fwrite函数则相反,用于把一块数据写入文件,其参数含义和fread类似,比如将一个结构体数组的数据写入文件可使用fwrite。
五、文件定位
rewind 函数:能使文件指针重新定位到文件开头,格式为rewind(fp);(fp 为文件指针),方便重新从头读写文件。
fseek 函数:可以按照指定的偏移量和起始位置来移动文件指针,格式为fseek(fp, offset, origin);,fp 是文件指针,offset 是偏移的字节数(正数向前、负数向后移动),origin 是起始位置(如SEEK_SET表示文件开头、SEEK_CUR表示当前位置、SEEK_END表示文件末尾)。例如fseek(fp, 10L, SEEK_SET);会将文件指针从文件开头向后移动 10 个字节。
ftell 函数:用于获取文件指针当前相对于文件开头的位置(返回字节数),格式为ftell(fp);(fp 为文件指针),可以配合其他定位函数使用,了解文件指针所处的具体位置情况。
六、文件操作的错误处理
在文件操作过程中,可能会出现诸如文件不存在、权限不足等各种错误情况。一般可以通过检查函数返回值(如fopen返回NULL就表示打开失败)以及使用ferror函数(用于检测文件操作中是否发生错误,若有错误返回非 0 值)、clearerr函数(用于清除文件错误标志)等方式来进行错误处理,确保程序对文件操作的稳定性和可靠性。
教材学习中的问题和解决过程(先问 AI)
问题:只写方式("w")的选择情况
AI:当需要创建一个全新的文件来存储数据时,“w” 模式是很好的选择。例如,你要创建一个文本文件来记录用户的登录信息,包括用户名和密码。可以使用以下代码:
- 上述代码定义了一个文件指针
fp
,以“w”模式打开(如果不存在就创建)名为“login_info.txt”的文件。如果打开文件成功,就使用fprintf
函数将用户名和密码信息写入文件,最后关闭文件。
- 覆盖原有文件内容重新写入
- 当你确定要丢弃文件原有的所有内容,重新写入新的数据时,“w”模式也适用。比如,有一个记录成绩的文件,每次考试后都需要更新成绩,而且不需要保留之前的成绩记录,就可以使用“w”模式。假设成绩数据存储在一个结构体数组中,代码示例如下:
#include <stdio.h> struct Student {char name[20];int score; }; int main() {FILE *fp;struct Student students[3] = {{"Alice", 90}, {"Bob", 85}, {"Charlie", 95}};int i;fp = fopen("scores.txt", "w");if (fp == NULL){perror("Error opening file");return 1;}for (i = 0; i < 3; i++){fprintf(fp, "%s %d\n", students[i].name, students[i].score);}fclose(fp);return 0; }
这里以 “w” 模式打开 “scores.txt” 文件,循环将新的学生成绩数据写入文件,原文件如果有内容会被清空后再写入新数据。
不过,在使用 “w” 模式时需要特别注意,因为它会无条件地清空文件内容。如果不小心用 “w” 模式打开了一个包含重要数据的文件,可能会导致数据丢失。所以在实际操作中,一定要谨慎确认文件操作的目的和要求是否与 “w” 模式的特性相匹配。
基于AI的学习