2024-2025-1(20241321)《计算机基础与程序设计》第十四周学习总结

news/2025/1/1 16:06:01/文章来源:https://www.cnblogs.com/guchuang/p/18639472
这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)
这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第十四周作业)
这个作业的目标 <深刻学习C语言,反思一周学习,温故知新>
作业正文 ... 本博客链接https://www.cnblogs.com/guchuang/p/18639472

教材学习内容总结

文件操作基础概念
文件是存储在计算机存储设备(如硬盘、U 盘等)中的数据集合。在编程中,文件操作主要包括打开、读取、写入和关闭文件等操作。这些操作可以让程序与外部文件进行数据交互,例如读取配置文件中的参数,或者将程序的运行结果保存到文件中。
文件类型有多种,常见的有文本文件(.txt)和二进制文件(如.docx、.png 等)。文本文件是以字符编码的形式存储数据,人类可以直接阅读其中的内容;二进制文件则是以二进制数据存储,需要特定的软件或程序来解析其内容。
打开文件
在许多编程语言中,打开文件是文件操作的第一步。通常使用特定的函数来打开文件,例如在 c 中,使用fopen()函数。
语法:file_object = open(file_name, mode)。其中file_name是要打开的文件的名称(包括路径),mode是打开文件的模式,如'r'表示读取模式,'w'表示写入模式,'a'表示追加模式等。
例如,要打开一个名为example.txt的文本文件用于读取,可以这样写:

问题一:fopen 打开文件失败的原因是什么?
解决方案:老师讲解
 1. 文件不存在(以读取模式打开时)

  • 当使用"r"(只读)模式打开文件时,如果文件不存在,fopen函数就会失败。因为在读取模式下,程序需要从已有的文件中获取数据,没有文件自然无法进行读取操作。
  • 例如:
#include <stdio.h>
int main() {FILE *file = fopen("nonexistent_file.txt", "r");if (file == NULL) {perror("打开文件失败");return 1;}// 文件操作代码fclose(file);return 0;
}
  • 在这个例子中,如果nonexistent_file.txt文件不存在,fopen就会返回NULL,程序通过检查file是否为NULL来判断文件打开是否失败。
  1. 没有足够的权限

    • 如果程序没有足够的权限访问文件,fopen也会失败。这种情况可能发生在以下场景中:
    • 试图打开一个受保护的系统文件或者其他用户拥有的文件,而当前用户没有读取或写入(取决于打开模式)的权限。
    • 例如,在某些操作系统中,普通用户可能没有权限访问/etc/shadow(存储用户密码哈希值的文件),如果尝试打开这个文件进行读取(假设没有足够权限),fopen会失败。
    • 或者在一个文件被设置为只读属性,而程序试图以写入模式(如"w""a")打开它,也会导致打开失败。
  2. 路径错误

    • 如果指定的文件路径不正确,fopen会找不到文件,从而导致打开失败。
    • 可能是路径中包含了错误的目录名、文件名拼写错误或者使用了不被操作系统识别的路径格式。
    • 例如,在Windows系统中,路径分隔符是\,如果在代码中写成/(像在Linux系统中那样)来指定路径,可能会导致文件无法找到。或者在指定相对路径时,相对的基准目录理解错误,也会出现路径问题。
  3. 磁盘故障或存储设备问题

    • 如果存储文件的磁盘出现故障,如坏道、文件系统损坏等情况,fopen可能无法正常打开文件。这种情况比较复杂,可能还会伴随着其他错误提示或者系统异常行为。
    • 例如,当移动硬盘出现硬件故障,而程序试图打开存储在该移动硬盘上的文件时,就可能会因为存储设备本身的问题而导致fopen失败。
  4. 文件被其他程序占用(独占模式等情况)

    • 有些程序在打开文件时会采用独占模式,这意味着其他程序在这个文件被独占期间无法打开它。如果尝试打开一个被其他程序以独占模式打开的文件,fopen会失败。
    • 例如,一个数据库管理程序可能会以独占模式打开数据库文件来进行维护操作,此时其他程序如果试图打开相同的数据库文件,fopen就会返回NULL
      问题二: 在 C 语言中,同时使用按字符读写文件和按格式读写文件操作同一个文本文件时,如何确保文件指针的位置正确,避免出现读写混乱以及数据丢失或重复读取的情况呢?
      解决方案:AI学习
      以下是在 C 语言中确保文件指针位置正确,避免读写混乱以及数据丢失或重复读取的方法和思路:

解决思路:

  1. 理解文件指针位置

    • 在 C 语言中,文件操作涉及的文件指针(FILE *)记录了文件的当前位置。文件操作函数(如 fgetc, fputc, fscanf, fprintf 等)会自动更新文件指针的位置。例如,fgetc 会将文件指针向前移动一个字符,fscanf 根据读取的数据量移动文件指针,fputsfprintf 则根据写入的数据量移动文件指针。
    • 可以使用 ftell 函数来获取文件指针的当前位置,其原型为:long ftell(FILE *stream);
    • 可以使用 fseek 函数来设置文件指针的位置,其原型为:int fseek(FILE *stream, long offset, int whence);offset 是偏移量,whence 可以是 SEEK_SET(文件开始)、SEEK_CUR(当前位置)或 SEEK_END(文件末尾)。
  2. 使用顺序操作

    • 为了避免混乱,尽量按照一定的顺序进行文件操作。例如,先完成所有的读取操作,再进行写入操作,或者反之。避免在读取和写入操作之间频繁切换,除非你明确知道如何管理文件指针的位置。
  3. 使用 rewind 函数重置文件指针

    • 当你完成了一系列的读取或写入操作后,如果需要重新开始操作,可以使用 rewind 函数将文件指针重置到文件的开头,其原型为:void rewind(FILE *stream);

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r+");  // 以读写模式打开文件if (file == NULL) {perror("无法打开文件");return 1;}// 按字符读取文件int ch;while ((ch = fgetc(file))!= EOF) {putchar(ch);}// 重置文件指针到文件开头rewind(file);  // 按格式写入文件int num = 123;float f = 3.14;fprintf(file, "%d %f", num, f);// 调整文件指针位置fseek(file, 0, SEEK_SET);  // 再次将文件指针设置到文件开头// 按格式读取文件int read_num;float read_f;fscanf(file, "%d %f", &read_num, &read_f);printf("读取到的整数: %d, 浮点数: %f\n", read_num, read_f);// 按字符写入文件fputc('A', file);fclose(file);return 0;
}

代码解释:

  1. 打开文件
    • FILE *file = fopen("example.txt", "r+");:以读写模式(r+)打开文件 example.txt。如果文件不存在,将导致打开失败。
  2. 按字符读取文件
    • while ((ch = fgetc(file))!= EOF) { putchar(ch); }:使用 fgetc 函数逐个字符读取文件内容,并使用 putchar 函数输出到标准输出,直到文件结束(EOF)。
  3. 重置文件指针
    • rewind(file);:使用 rewind 函数将文件指针重置到文件的开头,为后续的写入操作做准备。
  4. 按格式写入文件
    • fprintf(file, "%d %f", num, f);:使用 fprintf 函数按照格式将整数和浮点数写入文件。
  5. 调整文件指针位置
    • fseek(file, 0, SEEK_SET);:使用 fseek 函数将文件指针设置到文件的开头,为后续的按格式读取做准备。
  6. 按格式读取文件
    • fscanf(file, "%d %f", &read_num, &read_f);:使用 fscanf 函数按照格式从文件中读取整数和浮点数。
  7. 按字符写入文件
    • fputc('A', file);:使用 fputc 函数将字符 'A' 写入文件。

使用注意事项:

  • 读写模式选择
    • 选择正确的文件打开模式非常重要。例如,r+ 允许读写,但文件必须存在;w+ 会创建新文件或清空现有文件;a+ 会追加或创建文件。根据需求选择合适的模式。
  • 文件指针管理
    • 始终注意文件指针的位置。使用 ftell 来检查文件指针位置,使用 fseek 来调整文件指针位置,使用 rewind 来将文件指针重置到文件开头。
  • 错误处理
    • 在使用文件操作函数后,一定要检查返回值,确保操作成功。对于文件操作,特别是在文件打开、读取和写入时,要检查文件指针是否为 NULL 或操作结果是否符合预期。

通过上述方法,可以在 C 语言中同时使用按字符读写和按格式读写操作同一个文件时,较好地管理文件指针,避免读写混乱和数据丢失或重复读取的问题。
心得:要以机器语言学习

基于AI的学习

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第六周 400/3500 1/14 4/45

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861006.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11. 日期和时间控件

一、日期和时间控件日期和时间类也是 PySide6 中的基本类,利用它们可以设置纪年法、记录某个日期时间点、对日期时间进行计算等。用户输入日期时间及显示日期时间时需要用到日期时间控件,本节介绍有关日期时间的类及相关控件。我们可以在终端中使用 pip 安装 pyside6 模块。 …

浅析FHQ-treap

前言 更好的阅读体验 默认读者会 BST 的基本操作。 节点定义 替罪羊树采用了懒惰删除的方法,不会立即删除某个点,而是在重构时不放进数组。 struct node{ int ch[2], val; int siz1, siz2, cnt, sum; //扣去懒惰删除的节点数量,没扣去懒惰删除的节点数量,树内相同权值的…

20241313刘鸣宇《计算机基础与程序设计》第14周学习总结

2024-2025-1 20241313《计算机基础与程序设计》第14周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <写上具…

学习笔记:旋转treap

前言 更好的阅读体验。 无旋 treap。 默认读者会 BST 的基本操作、堆和旋转。 本文旋转部分和上面那篇文章的相同。 代码中是小根堆。 思想 treap 既是一棵二叉查找树(tree),也是一个二叉堆(heap)。 但是如果这两个数据结构用同一个权值维护,那么这两种数据结构是矛盾的。…

最早发明的自平衡二叉树:AVL

前言 更好的阅读体验 默认读者会基本的 BST 操作。 节点定义 平衡因子:BF(BalanceFactor),左子树高 \(-\) 右子树高。 平衡树是让树的形态尽可能像完全二叉树,而不是链。 在 AVL 中,我们认为 \(\left|\text{BF}\right|\le 1\),也就是 BF 为 \(0,1,-1\) 时的子树是平衡的,…

[COCI2015-2016#2] DRZAVA

思路 先把赛时想法搬一部分过来转化题意, 对于 \(n\) 个带权 \(k\) 的点, 任意两点 \(i, j\) 之间有双向连边, 其边权为 \(w_{i, j} = d_{i, j}\) , 求一最小阈值 \(C\) , 满足对于所有 \(w \leq C\) 的边连接后, 存在一个连通块 \(G\), 使得 \[\sum_{i = 1}^{\lvert G \rvert}…

The End

一、学期回顾 1.1 回顾你对于软件工程课程的想象 根据你对课程目标和期待,回顾目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么? 达成的目标与期待理论与实践结合: 课程的最大目标之一是将软件工程的理论知识应用到实践中。在这一点上…

关于本站

我是 fush,一个很菜的 oier。 这里,我只想分享一些自己在学习记录。 由于本人较菜,有哪里写的不严谨的地方欢迎指出。 除了下面几个账号(本人的),如果要转载请写明出处,谢谢。 洛谷

从 Leafy-Tree 到 WBLT

更好的阅读体验。 UPD:2024/12/04 添加序列操作 UPD:2024/12/10 添加可持久化 前言 前面说过 FHQ-treap 的缺点在于常数。 这次篇文章要讲解 WBLT,码量与 FHQ-treap 差的不多,结构与线段树类似。 也可以分裂合并(不推荐),可持久化,但常数远小于 FHQ-treap。 美中不足的…

快消零售业的创新之路:智能AI助力员工培训SOP高效构建

在快速消费品零售行业,员工培训是提升服务质量、增强竞争力的重要手段。然而,传统员工培训方式往往存在培训周期长、效果难以评估等问题,难以满足快消零售行业对于高效、精准培训的需求。随着人工智能技术的不断发展,智能AI在员工培训中的应用逐渐受到重视,特别是在构建员…

django rest framework 视图类关系图

纸上得来终觉浅,绝知此事要躬行

挖掘内部知识库在员工培训与发展中的巨大潜力

在当今快速变化的商业环境中,企业的核心竞争力越来越依赖于其员工的技能水平和持续学习能力。员工培训与发展不再是简单的技能传授,而是需要构建一个能够激发潜能、促进知识共享与创新的智慧学习生态。内部知识库,作为这一生态的核心组成部分,其潜力在员工培训与发展中日益…