zoukankan      html  css  js  c++  java
  • 20191302MyOD

    MyOD编程

    任务要求

    1. 复习c文件处理内容

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

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

    4. 编写Makefile

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

    c文件处理内容复习

    od命令详解

    • od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。

    • od命令格式
      od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]

    • 参数:

      -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  显示版本信息。

    • openeuler下测试od命令:

    C语言实现MyOD

    main.c

    #include "myodhead.h"
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(char argv[])
    {
        FILE *fp;
        char args[N],name[N],ch;
        int i=0;
        printf("please input file name:");
        scanf("%s",name);
        if((fp=fopen(name,"r"))==NULL){
            printf("ERROR!");
            exit(0);
        }
        while(fgets(args,M,fp)){
            tx(args,i++);
            tc(args);
        }
        fclose(fp);
     }
    

    tc.c

    #include "myodhead.h"
    #include <stdio.h>
    void tc(char args[]){
        int i;
        printf("      ");
        for(i=0;args[i]!='';i++)
        {
            if(args[i]=='
    ')
               printf("\n");
            else
               printf("%4c",args[i]);
        }
       printf("
    ");
    }
    

    tx.c

    #include "myodhead.h"
    #include<stdio.h>
    void tx(char args[],int j)
    {
        int i;
        char output[N];
        printf("%07o",16*j);
        j++;
        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("
    ");
    }
    

    myodhead.h

    #ifndef __MYODHEAD_H__
    #define __MYODHEAD_H__
    #define N 999
    #define M 17
    
    void tc(char args[]);
    void tx(char args[],int j);
    
    #endif
    

    编译运行

    • 编译
        gcc -Iinclude -c src/tx.c -o lib/tx.o
        gcc -Iinclude -c src/tc.c -o lib/tc.o
    
    • 运行
      gcc lib/*.o -Iinclude -o bin/myod
      • ./bin/myod

    静态库制作

    • gcc -c -Iinclude src/tc.c src/tc.c -Llib
      ar crv lib/libmyod.a lib/*.o

    动态库制作

    • gcc -fPIC -shared -o lib/libmyod.so -Iinclude src/*.c

    makefile制作

    • Makefile

    gdb调试

    问题及解决

    • 问题:在编译时报错
    • 解决:出现问题的原因是我将N作为全局变量放在了myodhead.h中,但未在tx.c中加入#include "myodhead.h",加上后问题解决
    • 问题:在运行时显示内容与od命令有差距
    • 解决:第一列并不表示文本,所以需要空出来,于是我在main.c文件中,在打印每行前,加入printf(" "),进行补充,结果显示正常
  • 相关阅读:
    小K(wifi)插座剖解
    《将博客搬至51CTO》
    超频真的不难!G3258超频4.5GHz全攻略
    触摸屏
    CAN通信(STM32)
    【 Beginning iOS 7 Development《精通iOS7开发》】05 Autorotation and Autosizing
    遇到的面试问题?都来解下
    hdu5336XYZ and Drops
    hadoop MR 任务 报错 &quot;Error: java.io.IOException: Premature EOF from inputStream at org.apache.hadoop.io&quot;
    leetcode-Subsets
  • 原文地址:https://www.cnblogs.com/dongjiashuai/p/15334770.html
Copyright © 2011-2022 走看看