2017-2018-1 20155313 《信息安全系统设计基础》 Myod
2017-2018-1 20155313 《信息安全系统设计基础》 Myod
Myod要求
1.复习c文件处理内容
2.编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3.main与其他分开,制作静态库和动态库
4.编写Makefile
5.提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
6.在博客园发表一篇博客,重点写遇到的问题和解决过程
解决过程
1.Linux环境下c语言的处理我们目前使用的是vim编辑器,vim编辑器的下载安装与调试在第一周的博客已经学习。我们通过使用vim编辑器对c语言程序及逆行编译,生成不同类型的文件,实现不同的功能,具体代码在第一周的博客中有进行整理。
除了vim以外,我们还使用了gdb进行断点调试,这些也在第二周的补交博客中进行了详细说明。
总而言之,之前在windows系统上无论使用code blocks还是vs++,我们以前学过的很多的功能在Linux上几乎都能实现,因此在课下也需要更多地去研究与学习。
2.首先一开始我对题目是不理解的,然后我想起来去年娄老师在java课上好像对我们提出了同样的要求,于是我们参考了去年同学写的博客,对od功能有了进一步的理解。
功能说明:输出文件内容。
语 法:od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]
补充说明:od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。
参 数:
-a 此参数的效果和同时指定"-ta"参数相同。
-A<字码基数> 选择要以何种基数计算字码。
-b 此参数的效果和同时指定"-toC"参数相同。
-c 此参数的效果和同时指定"-tC"参数相同。
-d 此参数的效果和同时指定"-tu2"参数相同。
-f 此参数的效果和同时指定"-tfF"参数相同。
-h 此参数的效果和同时指定"-tx2"参数相同。
-i 此参数的效果和同时指定"-td2"参数相同。
-j<字符数目>或--skip-bytes=<字符数目> 略过设置的字符数目。
-l 此参数的效果和同时指定"-td4"参数相同。
-N<字符数目>或--read-bytes=<字符数目> 到设置的字符数目为止。
-o 此参数的效果和同时指定"-to2"参数相同。
-s<字符串字符数>或--strings=<字符串字符数> 只显示符合指定的字符数目的字符串。
-t<输出格式>或--format=<输出格式> 设置输出格式。
-v或--output-duplicates 输出时不省略重复的数据。
-w<每列字符数>或--width=<每列字符数> 设置每列的最大字符数。
-x 此参数的效果和同时指定"-h"参数相同。
--help 在线帮助。
--version 显示版本信息。
在初步理解了od的功能以后我也理解了这道题目的含义,od是linux内部带的一个函数,可以输出文件内容,其他的参数可以选择输出的类型、内容等。现在我们需要编写一个c语言程序,并且在linux终端里使用myod test
的代码来实现od同样的功能。
以下是我使用od指令与自己编写的myod程序对test文本文件进行显示16进制ASII值的操作。
除此以外,我还通过指令查找到了linux系统中od的源代码,在除了这次进行的基础myod变成以外,还可以通过学习源代码对myod进一步地加工,使得更加完善。本次习题只是要求输出16进制的:ASCII数,但是我同样可以选择输入不同指令输出其他类型的数,比如8进制、10进制等等输出形式。
我将od的源代码放入一个博客中分享给需要看的同学们。
3.因为本次myod编写,我使用了一个函数就完成了该功能,所以没有使用静态库与动态库。对于静态库与动态库的使用,我在第二周的补交博客中详细完成了该内容,使用了娄老师给的mymath代码完成。
4.我对于Makefile的理解是一种动作,我们事先对这种动作进行定义,定义它编译的内容、顺序等信息,然后再在Linux终端里输入make
指令执行该动作,即实现“自动化编程”。
makefile 介绍
make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序。
首先,我们用一个示例来说明makefile的书写规则。以便给大家一个感性认识。这个示例来源于gnu的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。
2)如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的c文件,并链接目标程序。
只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
在接触Makefile的时候,我选择了娄老师在实验楼里推荐的教程进行了学习,那个教程比较简单,也轻松地完成了要求地编译内容,但是当涉及到更深程度,比如myod的程序编译以及库的制作时,就需要更加详细的资料进行学习。
以下是我使用make指令调用Makefile实现编译的截图。
5.截图如上所示。
6.本周发表博客两篇,一篇是主要是将课堂上没完成的问题进行总结与解决(下面有链接),另一篇则是本篇博客,主要是为了完成课后布置的作业,希望老师能对我的学习完成情况进行指导。
2017-2018-1 20155313 《信息安全系统设计基础》第二周课堂实验
学习中遇到的问题域解决方案
1.在编写myod的过程中如何读入文件?
解决方案:
一个c语言读写文件程序:
#include "stdio.h"
#include <stdlib.h>
main()
{
FILE *fp1;//定义文件流指针,用于打开读取的文件
FILE *fp2;//定义文件流指针,用于打开写操作的文件
char text[1024];//定义一个字符串数组,用于存储读取的字符
fp1 = fopen("d:\\a.txt","r");//只读方式打开文件a.txt
fp2 = fopen("d:\\b.txt","w");//写方式打开文件a.txt
while(fgets(text,1024,fp1)!=NULL)//逐行读取fp1所指向文件中的内容到text中
{
puts(text);//输出到屏幕
fputs(text,fp2);//将内容写到fp2所指向文件中
}
fclose(fp1);//关闭文件a.txt,有打开就要有关闭
fclose(fp2);//关闭文件b.txt
}