zoukankan      html  css  js  c++  java
  • 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,来控制结束。
  • 相关阅读:
    SQL 强化练习 (七)
    SQL 强化练习 (六)
    SQL 强化练习 (五)
    SQL 强化练习 (四)
    典型相关分析 CCA
    SQL 强化练习(三)
    双向 和 多重 RNN
    SQL 强化练习 (二)
    SQL 强化练习 (一)
    SQL 查询强化
  • 原文地址:https://www.cnblogs.com/shoudeyunkaijianyueming/p/15340520.html
Copyright © 2011-2022 走看看