Myod-20191304商苏赫

Myod

  • 复习c文件处理内容
  • 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
  • main与其他分开,制作静态库和动态库
  • 编写Makefile
  • 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
  • 在博客园发表一篇博客,重点写遇到的问题和解决过程

Linux下od使用

代码思路

首先要读取一个txt文件,然后利用fopen打开文件,用fgetc读取文件内的字符,然后利用printf函数%c,%x进行打印。最初始的构想是这样,这样还未实现上下结构上的对应。

后续修改了一些printf输出的格式,但是距离正确格式还差很远。

初次代码

#include <stdio.h>

void  myod(char *filename)
{
    FILE *p;
    char content;
    p=fopen(filename, "r");
    content=fgetc(p);
    while (content!=EOF)
    {
        printf("%c  ",content);
        printf("%x
 ",content);
        content=fgetc(p);
    }
}


int main()
{
    char file[100];
    printf("file's name: 
");
    scanf("%s",file);
    myod(file);
}

后续改进:读取文件大小,然后设置参数,规定一行打印16个然后换行,每4个连续打印。还有每四个打印的时候是逆序的。结果和od命令一致,但是Linux下运行的时候结尾总会有个0,但是在window的CodeBlock下运行结果是没有的。


代码:

#include <stdio.h>

void  myod(char *filename, int s)
{
    int i,m,x,k;
    int count=0;
    int count2=0;
    int a=0;
    int n=0;
    int g=1;

    FILE *p;
    char content;
    char c[100];
    p=fopen(filename, "r");

    while(n<s)
    {
        content=fgetc(p);
        c[n]=content;
        n++;
    }

    while (count<s)
    {
        for( i=1;i<=4;i++ )
        {
            k=g*4-1;
            for (m=1;m<=4;m++)
            {

                printf("%x",c[k]);
                k--;
                count++;
                if (count>=s)
                {
                    m=5;
                    i=5;
                    g++;
                }
            }
            g++;
            printf("  ");
        }
        printf("
");

        for( x=1;x<=16;x++)
        {
            printf("%c  ",c[a]);
            count2++;
            a++;
            if (count2>=s)
            {
                x=s;
            }
        }
        printf("
");
    }

}

int size(char *filename)
{
    FILE *p;
    p=fopen(filename, "r");
    fseek(p,0,SEEK_SET);
    int begin = ftell(p);
    fseek(p,0,SEEK_END);
    int end = ftell(p);
    int fileSize = end - begin;
    return fileSize;
}

int main()
{
    char file[100];
    printf("file's name: 
");
    scanf("%s",file);
    int s=size(file);
    myod(file,s);
}

把main分开制作静态库、动态库



makefile

遇到的问题及解决方法

刚开始的的代码,printf就直接使用%c和%x可以打印出想要的结果,问题在于输出的格式。要求上面十六进制,四个一组而且一组内是逆序的,还需要一行打印十六进制输出,一行打印字符输出。

  • 1.控制每行输出16个,每4个一组,需要两层循环,挨着四个打印完后打印printf(" ")。打印完16个后,换行打印字符。
  • 2.两层循环中使用变量k、g实现逆序。令g=1,k=4*g-1,内层循环打印c[k],k--打印出c[3]、c[2]、c[1]、c[0],外层循环g++。
  • 3.整个最外层有while()判断是否打印完,如果没有继续进入下一轮打印16个。假如文件内是20个字符,当一轮循环打印16个后,再次进入for循环又会打印16个就超出范围了。所以通过size函数获取文件大小后,在最内层循环内不断判断打印次数count是否>filesize,来控制结束。
原文地址:https://www.cnblogs.com/shoudeyunkaijianyueming/p/15340520.html