20181332BYB-MyOD实验

MyOD实验

一、实验要求

  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. 文件:能够存储数据的存储设备,文件其实是一系列的字节。文件通常存储到硬盘上。

2. 文件中的位置:文件有开头和结尾,还有一个当前位置,通常定义为从文件头到当前位置有多少个字节。

3. 文件流:流是外部数据或数据目的地的抽象表示,所以键盘、显示器上的命令行和磁盘文件都是流。

4. 文件访问:

打开文件:fopen() 
FILE *fopen(const char *name,const char *mode);

* 第一个变元是字符串指针,它是要处理的外部文件名称,它包含了文件名称字符串的地址。第二个变元也是一个字符串,称为文件模式,它指定对文件进行什么处理。

关闭文件:fclose() 
fclose( FILE *fp );

* 返回值:如果成功关闭文件,就返回0,否则返回EOF。

写入文本文件:fputc()——将一个字符写入文本文件
fputc(int ch,FILE *pfile);

* 参数:将第一个变元指定的字符写入第二个变元(文件指针)指定的文件中。

* 返回值:如果操作成功,就返回写入的字符,否则返回EOF

读取文本文件:fgetc()
int mchar = fgetc(pfile);

* fgetc()函数从打开的文本文件中读取一个字符。它将文件指针作为唯一的变元,把读取的字符返回int类型。

* 返回值:mchar变量int类型,因为如果到达文件尾,就返回EOF。

三、实验步骤及过程

代码部分:

主函数myod.c:
#include "head.h"
#include <stdio.h>
#include <string.h>
void main()
{
        char name[50];
        strcpy(name,"text.txt");
        ascii(name);
        hex(name);
}
转换 ASCII 码的函数 ascii.c :
#include "head.h"
#include <stdio.h>
#include <string.h>
void ascii(char *name)
{
        FILE *fp;
        char ch;
            fp=fopen(name,"r");
            ch=fgetc(fp);
        printf("output the ascii:
");


        while(ch!=EOF)
        {
        if(ch=='
')
                printf("
");
        else
                printf("%4d",ch);
                ch=fgetc(fp);
        }
        fclose(fp);
}

转换十六进制码的函数hex.c
#include "head.h"
#include <stdio.h>
#include <string.h>
void hex(char *name)
{
        FILE *fp;
        char ch;
        printf("out the hex:
");
        fp=fopen(name,"r");
        ch=fgetc(fp);
        while(ch!=EOF)
        {
                if(ch=='
')
                        printf("
");
                else
                        printf("%4x",ch);
                ch=fgetc(fp);
        }
        fclose(fp);
}
头文件head.h:
void hex(char *name);
void ascii(char *name);

文本文件test.txt:

hello 20181332 baiyunbang!

makefile:
myodl: main.o ascii.o hex.o
gcc main.o ascii.o hex.o -o myodmain.o: main.c gcc -c main.c ascii.o: ascii.c gcc -c ascii.c hex.o: hex.c gcc -c hex.c`

实验过程及截图:

(1)新建想要输出的txt文件;

(2)编写实现代码;

主函数myod.c:

头文件head.h:

转换 ASCII 码的函数 ascii.c :

转换十六进制码的函数hex.c

(3)静态库实现过程:

(4)动态库实现过程:

(5)makeflie实现过程:

四、实验中遇到的问题及解决方法

1. C语言代码的编写较为困难,通过学习有关文件的博客、翻书、百度的方法解决。

2. 在ascii.c中有'/n'输入成"/n"多次编译出错,反复检查后才发现问题。

3. 在编译过程中老是出现段错误:

五、实验心得体会

1. 本次实验难度较高,花费大量时间研究如何做出来。

2. C语言部分代码的实现方法已经忘记,只能重新学习写文件的方法......复习真的很重要!!!!

3. 学会了op命令的使用,可以将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示。
  • 参考资料:
  1. Linux下的od命令

  2. C语言文件处理

  3. ASCII码转换表

原文地址:https://www.cnblogs.com/baiyun-0722/p/13799032.html