首页 > 编程语言 >学期2024-2025-1学号20241416《计算机基础与程序设计》第十四周学习总结

学期2024-2025-1学号20241416《计算机基础与程序设计》第十四周学习总结

时间:2024-12-29 22:13:33浏览次数:6  
标签:fp 文件 存储 读取 20241416 学号 2024 字符 指针

作业信息
这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)
这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)
这个作业的目标 <写上具体方面>
作业正文 https://www.cnblogs.com/manurios/p/18639504
教材学习内容总结
C 语言程序设计第十三章总结
第十三章聚焦于 C 语言中至关重要的文件操作相关知识,为 C 程序与外部存储的数据交互提供了有力支撑。

一、文件基础认知
文件概念:
文件是存储在外部介质(如硬盘、U盘 等)上数据的有序集合。它是程序与外部世界进行数据交换的重要手段,使得数据能够持久保存,而非仅在程序运行期间存在于内存中。
分为文本文件和二进制文件。文本文件以 ASCII 码字符形式存储数据,每行以换行符‘\n’结尾,人眼可直接阅读其内容;二进制文件则按照数据在内存中的二进制存储形式原样保存,对于非字符数据(如整数、浮点数的二进制表示)存储更为紧凑、高效,但直接查看内容通常是乱码形式。
文件指针:
核心工具是 FILE * 类型的指针,它如同指向文件的“导航标”。声明方式如 FILE *fp;,通过这个指针,程序可以精准定位到文件内部的各个位置,实现数据的读写操作。不同的文件操作函数都依赖文件指针来指定操作对象。
二、文件打开与关闭
打开文件:
使用 fopen 函数,语法为 fp = fopen("文件名", "打开模式");。文件名需包含完整路径(若为相对路径,则相对于当前程序运行目录),打开模式决定了对文件的操作权限及方式。例如:
“r”:只读模式,用于打开已存在的文本文件,若文件不存在则打开失败;
“w”:只写模式,若指定文件不存在则创建新文件,若存在则清空文件原有内容;
“a”:追加模式,在已有文件末尾添加新数据,文件不存在时同样会创建。
对于二进制文件,模式字符后添加“b”,如“rb”“wb”“ab”,以表明处理二进制数据。
关闭文件:
务必使用 fclose(fp); 关闭文件。这一步骤至关重要,它不仅能确保写入的数据完整保存到文件中,还能释放系统为文件操作分配的相关资源,避免资源泄露。若程序打开多个文件未正确关闭,可能导致系统资源耗尽,影响程序及系统的稳定运行。
三、文件读写操作
按字符读写:
fgetc 函数从文件指针指向的文件中读取一个字符,语法为 ch = fgetc(fp);,它返回读取到的字符(以整数形式返回,可通过强制类型转换为字符型),若遇到文件末尾则返回特殊值 EOF(End Of File,在 stdio.h 中定义,通常值为 -1)。
fputc 函数用于向文件写入一个字符,如 fputc(ch, fp);,将字符 ch 写入 fp 指向的文件。常用于逐个字符处理文本文件,比如复制文件内容时,可按字符依次读取源文件并写入目标文件。
按字符串读写:
fgets 函数能从文件读取一行字符串,语法为 fgets(str, n, fp);,其中 str 是存储字符串的字符数组,n 是最多读取的字符数(包含‘\0’),它会读取到换行符‘\n’或读完 n - 1 个字符为止,读取的内容包含换行符(若有)并在末尾添加‘\0’。
fputs 函数将字符串写入文件,如 fputs(str, fp);,把字符数组 str 中的字符串(不包含‘\0’自动添加)写入 fp 指向的文件,常用于批量写入文本行。
格式化读写:
类似于标准输入输出的 scanf 和 printf,fscanf 和 fprintf 针对文件进行格式化读写。fscanf(fp, "格式控制字符串", 地址列表); 按照指定格式从文件读取数据并存入相应变量地址,fprintf(fp, "格式控制字符串", 表达式列表); 则将数据按格式写入文件。例如,从文件读取整数和字符串:fscanf(fp, "%d %s", &num, str);,向文件写入学生成绩信息:fprintf(fp, "学号:%s,成绩:%d\n", stu_id, score);,这对于处理结构化数据文件极为便利。
四、文件随机读写
移动文件指针:
fseek 函数实现文件指针的定位移动,语法为 fseek(fp, offset, origin);,其中 fp 是文件指针,offset 是偏移量(以字节为单位,正数向前、负数向后移动),origin 是起始位置,有以下常量指定:
SEEK_SET:文件开头,偏移量从文件起始处计算;
SEEK_CUR:当前位置,基于当前文件指针位置偏移;
SEEK_END:文件末尾,常用于从文件末尾往前定位。例如,要跳转到文件第 10 个字节处:fseek(fp, 10, SEEK_SET);。
获取文件指针位置:
ftell 函数返回文件指针当前相对于文件开头的偏移字节数,如 pos = ftell(fp);,常用于记录当前读写位置,以便后续操作回溯或判断文件处理进度。
通过对第十三章的学习,掌握文件操作技能后,C 程序能够实现诸如数据的长期存储备份、配置文件的读取与更新、复杂数据结构的文件化存储与读取等功能,大幅拓宽了 C 语言编程的应用场景,为开发实用、强大的软件奠定基础。

如果你对于总结中的知识点还有想要细化或者拓展的部分,随时告诉我,我来继续完善。
通过 AI 工具总结一下内容,自己再补充
通过思维导图形成知识体系
看懂就过,看不懂,学习有心得的记一下

教材学习中的问题和解决过程(先问 AI)
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

问题1:文件指针的作用是什么?
问题1解决方案:1. 定位文件位置
文件指针就像一个“书签”,它能够指出在文件中的具体位置。当打开一个文件后,文件指针初始时通常指向文件的开头。通过移动文件指针,可以在文件的不同位置进行读写操作。例如,在顺序读取一个文件时,文件指针会随着读取操作逐步向后移动,每次读取一个字符、一行字符串或者按照某种格式读取数据后,指针都会移动到下一个待读取的位置。
可以使用fseek函数来手动调整文件指针的位置。比如,有一个存储学生成绩的文件,文件格式为每个学生的信息占一行,包括姓名、学号和成绩。如果想要修改某个特定学生的成绩,就可以先通过一定的方式(如逐行读取并匹配学号)找到对应的行,然后使用fseek函数将文件指针定位到该行成绩数据的起始位置,再进行修改。
关联文件操作函数与文件实体
文件指针是C语言文件操作函数与实际文件之间的纽带。所有的文件读写操作函数(如fgetc、fputc、fgets、fputs、fscanf和fprintf等)都需要通过文件指针来确定操作的对象是哪一个文件。
例如,在程序中可能同时打开了多个文件,一个用于读取配置信息,一个用于记录日志。这时候就需要不同的文件指针来区分这些文件。假设有FILE *fp_config和FILE *fp_log两个文件指针,fp_config指向配置文件,fp_log指向日志文件。当使用fgets函数读取配置文件内容时,就会写成fgets(buffer, size, fp_config),而当需要将日志信息写入日志文件时,就会使用fputs(log_message, fp_log),这样就能够保证各个文件操作函数准确地作用于相应的文件。
方便文件的管理和操作流程控制
在复杂的文件处理场景中,文件指针可以帮助控制文件操作的流程。比如,在处理一个大型文件时,可以通过保存文件指针的位置来实现文件部分内容的重复读取或写入。
假设要对一个文本文件进行加密处理,在加密过程中,可能需要先读取一部分内容进行加密,然后将加密后的内容写回文件。这时可以先记录文件指针的初始位置,加密完一部分内容后,将文件指针移回初始位置,然后进行写回操作,从而保证文件内容的正确更新。同时,通过判断文件指针是否到达文件末尾(如通过fgetc返回EOF来判断),可以控制循环读取文件的过程,避免出现超出文件范围的错误操作。
问题2:文件包含什么?
问题2解决方案:1. 文本文件内容
字符数据:文本文件主要包含字符。这些字符可以是字母(如英文字母A - Z、a - z)、数字(0 - 9)、标点符号(如逗号、句号、分号等)和特殊字符(如换行符'\n'、制表符'\t'等)。例如,一个简单的文本文件可能包含一篇文章,其中有单词、句子、段落等,这些都是由字符组成的。
文本行结构:文本文件通常以行为单位组织内容。每行以换行符'\n'结尾,这使得文件内容在视觉上呈现出一行一行的形式。例如,在一个记录学生名单的文本文件中,每行可能记录一个学生的姓名、学号等信息,通过换行符来区分不同的学生记录。
编码格式相关字符:文本文件的字符编码也会影响其内容。常见的编码格式有ASCII、UTF - 8等。在ASCII编码中,每个字符用7位或8位二进制数表示,涵盖了基本的英文字母、数字和标点符号等。UTF - 8是一种可变长度的编码方式,可以表示全球多种语言的字符。例如,在一个包含多种语言文字(如中文、日文、英文)的文本文件中,就需要使用UTF - 8这样的编码格式来正确存储字符。
二进制文件内容
原始数据表示:二进制文件包含的数据是以其在内存中的二进制存储形式直接保存的。对于整数、浮点数等数据类型,它们在二进制文件中的存储方式与在计算机内存中的存储方式相同。例如,一个整数int num = 123;在内存中是以二进制形式存储的,当将这个整数存储到二进制文件中时,也是按照这个二进制形式进行存储。
数据结构和对象存储:二进制文件还可以用于存储复杂的数据结构和对象。例如,一个结构体数组可以直接存储到二进制文件中。假设有一个结构体struct Student{char name[20]; int age; float score;};,一个包含多个Student结构体的数组可以通过一定的文件操作(如fwrite)以二进制形式存储到文件中,这样可以高效地保存和恢复数据结构的完整信息。
非字符数据类型组合:二进制文件中可能包含多种非字符数据类型的组合。例如,一个图形文件可能包含图像的像素数据(以二进制形式表示颜色值)、图像的尺寸信息(整数表示宽度和高度)等。这些不同类型的数据按照一定的顺序和格式存储在二进制文件中,用于完整地描述图形的信息。
...
基于AI的学习
问题1:文件指针和指针文件的区别?
问题1解决方案:1. 文件指针(File Pointer)
定义和本质:
文件指针是一个指向FILE类型结构体的指针。在C语言中,FILE是一个包含了文件相关信息(如文件缓冲区的位置、文件当前读写位置、文件的打开模式等)的结构体。例如,当声明FILE *fp;时,fp就是一个文件指针,它用于在程序中操作文件。
它是一种变量类型,其主要作用是帮助程序定位和访问文件内部的不同位置,从而实现文件的读写操作。文件指针类似于一个导航工具,引导程序在文件这个“数据海洋”中找到要操作的具体位置。
用途和操作方式:
文件指针用于各种文件操作函数,如fopen、fclose、fgetc、fputc、fgets、fputs、fscanf和fprintf等。例如,fp = fopen("test.txt", "r");使用fopen函数打开一个名为test.txt的文件,并将返回的文件指针赋值给fp,之后就可以通过fp这个文件指针使用其他文件操作函数对文件进行操作。
通过移动文件指针(例如使用fseek函数),可以在文件中进行随机读写。比如,fseek(fp, 10, SEEK_SET);可以将文件指针从文件开头向后移动10个字节的位置,这样后续的读写操作就会从这个新位置开始。
指针文件(这个说法不太准确,推测可能是误解,也许是指向文件的指针相关概念或者含有指针的文件内容)
如果是指向文件的指针相关概念(正确表述还是文件指针):
如前面所述,重点在于利用指针来操作文件,通过对文件指针的各种操作来完成对文件的访问和处理。
如果是含有指针的文件内容(这是一种比较特殊的情况):
在C语言中,如果要将指针存储到文件中,情况会比较复杂。因为指针的值是一个内存地址,当把这个指针存储到文件中再读取出来时,这个内存地址可能已经无效(例如程序重新运行后,之前的内存分配情况发生了变化)。
不过,在某些特定场景下,比如存储一个指向动态分配内存区域的指针(例如一个链表结构的数据存储在文件中),需要谨慎处理。通常会先将指针所指向的数据(如链表节点中的数据)按照一定的规则存储到文件中,并且可能需要记录一些额外的信息来帮助在读取文件时重新构建指针关系。这种情况下,文件内容包含了一些可以用于恢复指针指向的数据结构的信息,但这和文件指针本身的概念是不同的,文件指针主要用于文件操作过程中的定位,而含有指针的文件内容涉及到数据结构在文件中的存储和恢复。
问题2:fget和fscanf的区别?
问题2解决方案:1. 区别
数据读取方式
fgetc:它是以字符为单位进行读取。每次调用fgetc函数,只会从文件中读取一个字符。例如,如果有一个文本文件test.txt,内容是“Hello”,使用fgetc读取时,需要多次调用才能逐个获取字符'H'、'e'、'l'、'l'、'o'。它返回的是读取到的字符的ASCII码值(在stdio.h中定义为int类型),当读取到文件末尾时返回EOF(通常是 - 1)。
fscanf:则是按照指定的格式进行读取。它可以根据格式化字符串来读取不同类型的数据,如整数、浮点数、字符串等。例如,对于文件中有格式为“123 name”的数据行,使用fscanf(fp, "%d %s", &num, name);可以一次性将整数123读取到变量num中,将字符串“name”读取到字符数组name中。
对文件内容格式的要求
fgetc:对文件内容格式要求较低,因为它只是逐个读取字符,几乎可以处理任何文本文件,不管文件内容是有规则的格式化数据还是无规则的文本内容。例如,对于一个包含小说内容的文本文件,fgetc可以很好地逐字符读取用于显示或其他简单处理。
fscanf:要求文件内容必须符合其指定的格式。如果文件内容格式与fscanf函数中的格式化字符串不匹配,会导致读取错误。例如,若格式化字符串是%d,但文件中的下一个数据是一个字符而不是整数,就会出现读取问题。
使用场景和灵活性
fgetc:适用于简单地处理文本文件,如复制文件内容、统计文件字符数等场景。例如,要编写一个程序来统计文件中某个字符出现的次数,使用fgetc就很方便。它在处理字符流时比较灵活,不需要提前知道文件内容的格式。
fscanf:更适合读取有固定格式的数据文件,如配置文件(格式可能是“key = value”)、数据记录文件(如“学号 姓名 成绩”)等。它能够直接将文件中的数据按照预定格式解析到变量中,方便进行后续的数据处理,但灵活性相对较差,因为格式一旦确定,文件内容格式必须与其匹配。
联系
都是文件读取函数:它们都是用于从文件中读取数据的函数,都需要一个有效的文件指针作为参数来指定要读取的文件。例如,在使用fgetc(fp)和fscanf(fp, "格式字符串", 变量地址列表)时,fp都是指向要读取文件的文件指针。
可以配合使用:在一些复杂的文件读取场景中,它们可以配合使用。例如,先使用fgetc函数读取文件的开头部分,判断文件的类型或者格式(比如通过读取文件头几个字符来判断是二进制文件还是文本文件),然后根据判断结果使用fscanf来按照合适的格式读取文件内容。或者在读取一个包含多种数据类型和格式的文件时,先用fgetc跳过一些不需要的字符部分,再使用fscanf读取关键的数据部分。
三个原则:

切勿原封不动地接受生成式人工智能工具的输出;确保对其进行评估、完善和修改(或提示),以适应您的目标。
切勿将任何个人数据(自己、同学、老师等)或版权材料纳入到你的提示词中。这个可以说是保护个人隐私的最起码的举措。
所有人工智能生成工具都容易产生幻觉,因此会生成不准确或误导性的信息,要学会甄别信息真假
选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容

“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”

核心是要求GPT:“请你以苏格拉底的方式对我进行提问”

然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”

如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”

GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

代码调试中的问题和解决过程
问题1:XXXXXX
问题1解决方案:XXXXXX
问题2:XXXXXX
问题2解决方案:XXXXXX
...
代码托管
(statistics.sh脚本的运行结果截图)

上周考试错题总结
错题1及原因,理解情况
错题2及原因,理解情况
...

标签:fp,文件,存储,读取,20241416,学号,2024,字符,指针
From: https://www.cnblogs.com/rockytyh/p/18639644

相关文章

  • 2024.12.29-4 选票系统
    #include<stdio.h>#include<string.h>structXuanmin{      charname[32];   intpiao;   };intmain(){   structXuanminxm[3];   inti;   intj;   intlen;   inttotal;   chartmpname[32];   len=si......
  • 2024.12.29-3 结构体与数组
    一个案例,讲明定义用法:#include<stdio.h>#include<string.h>structStudent{      intnum;   charname[32];   intage;   charsex;   charaddr[32];   doublescore;   };intmain(){   intarr[3]={1,2,3};  ......
  • 2024.12.29-2 结构体的小应用
    例题,有两个学生,输入两个学生的信息,输入成绩高的学生信息。方法一:#include<stdio.h>#include<string.h>//定义结构体。放在mian()外,为全局变量的感觉structStudent//开头必须大写。{   intnum;   charname[32];   charsex;   intage;   ......
  • 2024.12.29-1 结构体(基础)
    1)原因:一个整体需要用不同类型(intchar等等)的数据来描述,结构体是更好的来描述内容的工具。2)理解:与数组类似,为不同元素的集合体。3)定义://定义结构体。类似于模板,一般不给赋予具体的值,每一项也并不是都要使用。structStudent//开头必须大写。{   intnum;   ch......
  • 学期2024-2025-1 学号20241428 《计算机基础与程序设计》第13周学习总结
    作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(](https://i.cnblogs.com/posts/edit))这个作业的目标 《C语言程序设计》第12章并完成云班课测试教材学习内容总结文件指针:在C语言中,使用FILE类型定义文......
  • 2024-2025-1 20241409 《计算机基础与程序设计》第四周学习总结
    作业信息作业归属课程:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04作业目标:门电路;组合电路,逻辑电路;冯诺依曼结构;CPU,内存,IO管理;嵌入式系统,并行结构;物理安全作业正文:教材学习内容总结《计算机科学概......
  • 学期 2024-2025-1 学号 20241409《计算机基础与程序设计》第十四周学习总结
    作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标 《C语言程序设计》第十四章作业正文 本周学习内容进行了缓冲区溢出实验缓冲区溢出是指程序试图向缓冲区写入超出预分配固定......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第十四周学习总结
    学期2024-2025-1学号20241311《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第一周作业这个作业的目标<写上具体......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第十四周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标《C语言程序设计》第13章作业正文https://www.cnblogs.com/wchxx/p/18639513**教材学习内容总结1.......
  • 学期2024-2025-1学号202413177 《计算机基础与程序设计》第十四周学习总结
    学期2024-2025-1学号202413177《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写上具......