MyOD实验——20181211

一、实验要求:

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

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

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

  4. 编写Makefile;

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

 

二、实验原理

od命令

1. 功能

od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。

常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出。

2. 命令格式

od [<选项><参数>] [<文件名>]

3. 命令选项

-t<TYPE>:指定输出格式,格式包括a、c、d、f、o、u和x,各含义如下:

  • a:具名字符;
  • c:ASCII字符或者反斜杠;
  • d[SIZE]:十进制,正负数都包含,SIZE字节组成一个十进制整数;
  • f[SIZE]:浮点,SIZE字节组成一个浮点数;
  • o[SIZE]:八进制,SIZE字节组成一个八进制数;
  • u[SIZE]:无符号十进制,只包含正数,SIZE字节组成一个无符号十进制整数;
  • x[SIZE]:十六进制,SIZE字节为单位以十六进制输出,即输出时一列包含SIZE字节。在默认条件下,以四个字节为一组输出

 

三、实验过程

  1. 代码部分

myod.c

#include "head.h"
#include <stdio.h>
void main()
{ 
  char name[50];
  printf("please input the txtname:");
  scanf("%s",name);
  ascii(name);
  hex(name);
}

ascii.c

#include "head.h"
#include <stdio.h>
void ascii(char *name)
{
    FILE *fp;
    char ch;
    fp = fopen(name, "r");
    ch = fgetc(fp);
    printf("output the ascii:\n");
    
    while(ch != EOF)
    {
        if(ch == '\n')
            printf("\n");
        else
            printf("%4d", ch);
            ch = fgetc(fp);
    }
    fclose(fp);
}

hex.c

#include "head.h"
#include <stdio.h>
void hex(char *name)
{
    FILE *fp;
    char ch;
    printf("output the hex:\n");
    fp = fopen(name, "r");
    ch = fgetc(fp);
    while(ch != EOF)
    {
        if(ch == '\n')
            printf("\n");
        else
            printf("%4x", ch);
        ch = fgetc(fp);
    }
    fclose(fp);
}

head.h

#ifndef HEAD_H
#define HEAD_H
void hex(char *name);
void ascii(char *name);
#endif

 

2. 新建并输入txt文件

txt文件内容可以随意输入。

 

3.编译文件并进行运行

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

4. main与其他分开,制作静态库

gcc -c ascii.c -o ascii.o
gcc -c hex.c -o hex.o
ar rcvs myod.a *.o
gcc myod.c -o myod -L. myod.a

5. main与其他分开,制作动态库,对ascii.c和hex.c制作动态库,然后gcc编译即可。

 

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

 

gcc -shared -fPIC -o myod.so ascii.c hex.c
gcc myod.c myod.so

6. 编写Makefile

test:myod.o ascii.o hex.o
        gcc myod.o ascii.o hex.o -o test
myod.o:myod.c head.h
        gcc -c myod.c -o myod.o
ascii.o:ascii.c head.h
        gcc -c ascii.c -o ascii.o
hex.o:hex.c head.h
        gcc -c hex.c -o hex.o

修改test.txt文件中的内容,将随机输入的字符改为学好20181211

 

 

四、实验遇到的问题及其解决方案

  题目要求有ascii码需要16进制形式表示,每次输入都要判断当前字符个数。在这次myod的测试中,我们重新复习了文件的读取等操作,调试时出现了很多问题,myod.a无法添加符号:归档没有索引;运行ranlib以添加一个这种报错信息经过检查发现。

  在形成静态库时,误把.o文件写成.c文件,动态库完成时,学习了可以设置程序共享库位置也就是使用 “export LD_LIBRARY_PATH”,相对于之前的直接复制,这样操作只是临时设置变量 LD_LIBRARY_PATH ,下次开机,一切设置将不复存在,多数情况应该使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib,我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 语句,前者在每次登陆和每次打开 shell 都读取一次,后者只在登陆时读取一次。

  在此次实验中,我们从文件操作方面复习c语言在linux的操作、静态库和动态库,用%x表示接收16进制等基础知识,在平常中很少接触,这是一种复习和扩展。


 

posted @ 2020-10-11 16:39  regina1st  阅读(114)  评论(0编辑  收藏  举报