zoukankan      html  css  js  c++  java
  • 选做1---myod的实现

    要求:

    1.复习c文件处理内容

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

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

    4.编写Makefile

    od命令

    1.执行结果

    2.功能

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

    常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

    3.格式

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

    4.常用的命令选项

    -t,--format=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字节。

    myod分析

    要利用myod去实现od命令的功能,但是这个是被简化的od命令,只需要能够显示文件内容的ascll码和16进制码,所以只需要写两个函数就可以完成需求,一个是转16进制并输出,一个是转成ascll码并输出。

    遇到的问题

    1.与Linux命令下的输出显示不对应

    这是一开始我的函数设计的问题,直接printf("%4x")导致了结果和od的不同,因为od命令默认以四字节为一组,因此要做到可以一次打印4个字节就需要采用循环的方式来完成。
    原:printf("%4x",args[i]);
    现: for(i=0;args[i]!='';i=i+4) { printf(" %x%x%x%x",output[i+3],output[i+2],output[i+1],output[i]); }

    2.没有前面的7位数字

    前面7位数字是显示在此行之前的字符数,进制采用的是8进制,这个实在是不会,在网上查阅资料才知道是干什么的,改的话也是在网上查阅资料后,是采用
    printf("%07o",size*变量)的方式,加入此代码后,也确实实现了显示字符数的功能

    3.发现程序无法显示“ ”的ASCII字符,但linux的od命令可以

    有点类似sh脚本中显示$的问题,因此采取printf("\n");就可以显示了

    4. 采用ch=fgetc(fp)的不方便

    因为1.的问题我改变了思路,只在Main函数中打开文件,其他的函数将文件内容写入数组后传入,方便之后的操作

    静态库

    动态库

    调试

    结果

    代码

    头文件

    `#ifndef HEAD_2021_H

    define HEAD_2021_H

    include <stdio.h>

    include <stdlib.h>

    define N 100

    void tc(char args[]);
    void tx(char args[]);

    endif

    `

    tc函数

    include "head.h"

    void tc(char args[])
    {
    printf("ascll code");
    int i;
    for(i=0;args[i]!='';i++)
    {
    if(args[i]==' ')
    printf(" ");
    else
    printf("%4c",args[i]);
    }
    printf(" ");
    }

    tx函数

    include "head.h"

    void tx(char args[])
    {
    printf("hex code: ");
    int i;
    int j=0;
    printf("%07o",16*j);
    j++;
    char output[N];
    for(i=0;args[i]!='';i++)
    {

        if(args[i]=='
    ')
        {
                output[i]='
    ';
        }
        else
        {
                output[i]=args[i];
        }
    }
    

    for(i=0;args[i]!='';i=i+4){
    printf(" %x%x%x%x",output[i+3],output[i+2],output[i+1],output[i]);
    }
    printf(" ");
    }

    Main函数

    include "head.h"

    int main(char argv[])

    {
    FILE *fp;
    char args[N],name[N];
    printf("please input file name:");
    scanf("%s",name);
    fp=fopen(name,"r");
    while(fgets(args,17,fp))
    {
    tx(args);
    tc(args);
    }
    fclose(fp);
    }

    makefile

    myod : head.h tx.c Main.c tc.c
    gcc -o myod head.h tx.c tc.c Main.c

  • 相关阅读:
    有关.net 框架的学习笔记
    简单定义工程架构
    respondsToSelector的相关使用
    IOS框架和服务
    iOS常用第三方类库
    ios换肤思想,及工具类
    集成激光推送
    远程推送
    ios本地推送
    UIPopoverController 的使用
  • 原文地址:https://www.cnblogs.com/20191301lhq/p/15334671.html
Copyright © 2011-2022 走看看