• 20181313毕然《信息安全系统设计与实现》——Myod


    一、实验要求

    1.复习c文件处理内容;

    2.编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能;

    3.main与其他分开,制作静态库和动态库;

    4.编写Makefile;

    5.提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息;

    6.在博客园发表一篇博客,重点写遇到的问题和解决过程。

    二、实验内容

    c文件

    一般指存储在外部介质上数据的集合。根据数据的组织形式,分为文本文件和二进制文件两种。

    文本文件,又称为ASCII文件,是以字符编码的方式进行保存的。

    二进制文件将内存中数据原封不至文件中,适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码。

    其实,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。

    而本次实验中,就对比了ASCII文件和十六进制文件。

    文件存取方式:包括顺序存取方式和随机存取方式两种。
    顺序读取也就是从上往下,一笔一笔读取文件的内容。保存数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件,而被存取的文件则称为顺序文件。
    随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。

    文本文件操作

    C语言中主要通过标准I/O函数来对文本文件进行处理。相关的操作包括打开、读写、关闭与设置缓冲区。
    相关的存取函数有:fopen(), fclose(), fgetc(), fputc(), fgets(), fputs(), fprintf(), fscanf()等。

    打开文件

      函数原型为:_CRTIMP FILE * __cdecl fopen(const char *, const char *);

      第一参数为文件名,第二个参数为打开模式。

      打开成功,fopen返回一个结构指针地址,否则返回一个NULL。如果没有指定文件路径,则默认为当前工作目录。

       使用fopen()函数打开的文件会先将文件复制到缓冲区。所下达的读取或写入动作,都是针对缓冲区进行存取而不是磁盘,只有当使用fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。

      打开文本文件:
    "r":只能从文件中读数据,该文件必须先存在,否则打开失败
    "w":只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
    "a":向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
    "r+":可读/写数据,该文件必须先存在,否则打开失败
    "w+":可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
    "a+":可读/写数据,原来的文件不被删去,位置指针移到文件末尾
    打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母'b’,以表示以二进制形式打开文件。

    关闭文件

      函数原型为:_CRTIMP int __cdecl fclose(FILE *);

      关闭成功返回值0,否则返回非零值。

    字符存取

      字符读取函数fgetc()可从文件数据流中一次读取一个字符,然后读取光标移动到下一个字符,并逐步将文件的内容读出。

      如果字符读取成功,则返回所读取的字符,否则返回EOF(end of file)。EOF是表示数据结尾的常量,真值为-1。另外,要判断文件是否读取完毕,可利用feof()进行检查。未完返回0,已完返回非零值。

    字符串存取

    fgets函数的作用是从指定文件读入一个字符串,如:fgets(str, n, fp);

    参数n为要求得到的字符个数,但只从fp指向的文件输入n-1个字符,然后在最后加一个'\0'字符,因此得到的字符串共有n个字符,把它们放在字符数组str中。如果在读完n-1个字符之前遇到换行符或EOF,读入结束。

    fputs函数的作用是向指定文件输出一个字符串,如:fputs("Hey", fp);

    把字符串"Hey"输出到fp指向的文件。fputs函数的第一个参数可以是字符串常量、字符数组名或字符型指针。若输出成功,则返回0,否则返回EOF。

    三、实验步骤

    1、编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

    根据文本文档中内容 “20181313br

    ASCII值为 50 48 49 56  49 51 49 51 98 114

    转换为16进制得到 32 30 31 38 31 33 31 33 62 72

    经过验算,与程序转换结果相同

     各文件代码如下图所示:

    ascii.c

     hex.c

     myod.c

     test.txt

    新建文本文档,输入随机内容(“20181313br”)

     head.h

    2、main与其他分开,制作静态库

    3、制作动态库

    4、编写Makefile

    四、实验心得

      Myod对我来说是一个涉及较少的内容,实验之初就需要查找资料来了解od的相关知识,以及复习c文件的相关操作。首先需要注意的是在执行完文件的操作后,要进行“关闭文件”操作。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,这时就要自行手动关闭不再使用的文件,来提高系统整体的执行效率。在制作动态库时,出现了无法找到共享文件的问题,经过查找资料,得知系统默认扫描目录为/lib、/usr/lib、/usr/local/lib,这三个目录加入效果都一样,只是因为规范问题所以有多个目录。将xxxx.so文件复制到上述目录,在链接时系统就会自动进行寻找。或者修改/etc/ld.so.conf文件,将共享库所在目录,加入ld.so.conf文件,这样系统就会自动扫描目录。这种方法同样需要执行ldconfig。还有一种方法是修改LD_LIBRARY_PATH环境变量:

    export LD_LIBRARY_PATH=/home/yourid/soDir:$LD_LIBRARY_PATH

      经过这次实验,我对c文件的操作、od等方面的知识有了更深层次的了解,之后继续在每次实验中获取知识,了解错误的原因和解决办法。

  • 相关阅读:
    NOIP2009 pj
    数星星(POJ2352 star)
    洛谷 p3372 模板-线段树 1
    Luogu P1198 [JSOI2008]最大数 线段树
    Bestcoder#92&HDU 6017 T3 Girl loves 233 DP
    NOIP2008pj & luoguP1058 立体图 模拟
    NOIP2003TG 加分二叉树 区间DP
    Redis Jedis lua脚本
    Mac Ideal 常用快捷键
    Mysql慢查询explain
  • 原文地址:https://www.cnblogs.com/bbbbblue/p/13799219.html
Copyright © 2020-2023  润新知