2024-2025-1 20241403《计算机基础与程序设计》第十四周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(2024-2025-1计算机基础与程序设计第十四周作业) |
这个作业的目标 | 二进制文件和文本文件 文件的打开和关闭 按字符读写文件 按格式读写文件 按数据块读写文件 文件的随机读写 文件输入/输出重定向 |
作业正文 | https://www.cnblogs.com/chenqiqi/p/18639403 |
教材学习内容总结
二进制文件和文本文件:
文本文件:以文本形式存储数据,文件中的数据可以被人类阅读。在文本文件中,数据通常以字符形式存储,并且有特定的编码格式,如ASCII或UTF-8。
二进制文件:以二进制形式存储数据,文件中的数据通常是非文本的,比如图片、音频、视频等。二进制文件中的数据不能直接被人类阅读,需要特定的程序来解析。
文件的打开和关闭:
打开文件:在编程中,打开文件通常需要指定文件路径和打开模式(如只读、写入、追加等)。例如,在Python中,可以使用open()函数打开文件。
关闭文件:文件使用完毕后需要关闭,以释放系统资源。在Python中,可以使用close()方法关闭文件,或者使用with语句自动管理文件的打开和关闭。
按字符读写文件:
按字符读写文件意味着每次读取或写入一个字符。在Python中,可以使用read(1)或write()方法按字符读写。
按格式读写文件:
按格式读写文件是指按照特定的格式(如整数、浮点数、字符串等)读取或写入数据。在Python中,可以使用readline()、readlines()、read()等方法按行或按需读取,以及format()函数或%操作符格式化字符串。
按数据块读写文件:
按数据块读写文件意味着每次读取或写入一定大小的数据块。在Python中,可以使用read(size)和write(data)方法,其中size指定了块的大小。
文件的随机读写:
随机读写文件是指可以跳到文件的任意位置进行读写。在Python中,可以使用seek(offset)方法移动文件指针到指定位置,然后进行读写操作。
文件输入/输出重定向:
文件输入/输出重定向是指将标准输入输出流重定向到文件。在命令行中,可以使用>将输出重定向到文件,使用<将输入重定向自文件。在编程中,可以通过修改标准输入输出流的引用来实现重定向。
教材学习中的问题和解决过程(先问 AI)
-
问题1:在对一个大型二进制文件进行按数据块读写时,如何优化读写性能以减少系统开销,并确保数据的完整性和准确性?同时,如果在读写过程中遇到文件损坏或硬件故障导致的部分数据丢失,如何进行有效的错误恢复和数据一致性保证?
-
问题1解决方案:
为了优化大型二进制文件按数据块的读写性能,可以采取以下措施:
使用较大的缓冲区来减少系统调用次数。例如,定义一个合适大小的字符数组作为缓冲区,通过fread和fwrite函数以较大的数据块进行读写操作,而不是逐个字节或小数据量地读写。
采用顺序读写方式,因为对于机械硬盘来说,顺序读写的性能远高于随机读写。尽量避免频繁的文件指针移动操作,除非确实需要随机访问文件中的特定位置。
对于多核处理器系统,可以考虑使用多线程或多进程来并行地进行文件读写操作,但要注意线程 / 进程间的同步和数据一致性问题。
当遇到文件损坏或数据丢失的情况时:
在每次成功写入数据块后,可以立即计算并保存该数据块的校验和(如 CRC 校验和)。在读取数据时,先验证校验和,如果校验和不匹配,则说明数据可能已损坏。对于损坏的数据块,可以尝试从备份文件(如果存在)中恢复,或者根据文件的格式和数据的逻辑关系进行部分数据的修复(例如对于一些结构化的数据文件,可以根据其他完整的数据块来推断和修复损坏部分的数据)。
建立日志文件记录文件操作的关键信息,包括每次读写的数据块位置、大小和操作结果等。在发生错误时,可以通过分析日志文件来确定数据丢失或损坏的位置和范围,以便更有针对性地进行恢复操作。同时,定期对日志文件进行清理和归档,避免其占用过多的存储空间。 -
问题2:在 C 语言中,同时使用按字符读写文件和按格式读写文件操作同一个文本文件时,如何确保文件指针的位置正确,避免出现读写混乱以及数据丢失或重复读取的情况呢?
-
问题2解决方案:
在 C 语言中,无论是fgetc(按字符读写)还是fscanf(按格式读写)等文件操作函数,它们都会自动维护一个内部的文件指针,用于指示当前读写操作在文件中的位置。
首先,要明确每个函数操作后文件指针的移动规则:
fgetc每读取一个字符,文件指针就会向后移动一个字节的位置,使其指向下一个待读取的字符。
fscanf根据其格式控制字符串来解析并读取文件中的数据,读取完相应的数据后,文件指针会移动到本次读取结束的位置,通常是刚好越过刚读取的数据部分,为下一次读取做好准备。
为避免读写混乱等问题:
不要在不了解文件指针当前位置以及操作影响的情况下,随意混合使用不同的读写函数,除非有明确的逻辑来处理文件指针的协调。例如,如果先用fscanf按格式读取了一行数据,此时文件指针移动到了该行数据末尾,若紧接着想用fgetc读取下一个字符,是没问题的,它会从文件指针当前位置继续往后读取。但如果想回退到之前读取过的某个位置重新读取,那就需要使用fseek函数来显式地调整文件指针位置了,比如fseek(fp, -10L, SEEK_CUR);就可以将文件指针从当前位置回退 10 个字节(假设文件是以二进制模式打开,文本模式下字节数的计算可能因编码等因素有差异)。
在复杂的文件操作场景中,可以添加适当的调试输出语句,打印出文件指针当前的位置(可以通过ftell函数获取文件指针相对文件开头的偏移字节数),以便清晰地了解文件指针的状态,及时发现位置异常的情况并进行修正。
基于AI的学习
代码调试中的问题和解决过程
- 问题1:在改地址的时候,直接按照模版改,导致改后地址错误,没有攻击成功
- 问题1解决方案:
根据语句strcpy(buffer + 100,shellcode)计算shellcode的地址为0xffffd4b0+0x640xffffd514。然后修改exploit.c文件,将\x??\x??\x??\x??修改为计算的结果\x14\xd5\xff\xff,注意顺序是反的。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第十三周 | 500/6000 | 1/13 | 20/20 | |
第十四周 | 500/6500 | 1/14 | 18/38 | |
第十五周 | 0/7000 | 0/15 | 22/60 |