• Linux下c语言实现myod


    • 首先根据od要输出16进制的功能,以及c语言中文件的打开读取等函数,编写了如下代码。
    #include<stdio.h>
    #define N 1000
    int main()
    {
        int count1=0,count2=0,number=0;
        FILE *fp1;
        char model[N],name[N];
        char str;
        printf("name:");
       scanf("%s",&name);
        if((fp1=fopen(name,"r"))==NULL)
        {
            printf("ERROR");
            exit(0);
        }
        while(fgets(model,N,fp1))
        {
            while(model[number]!='')
            number++;
            while(1)
            {
                printf("%c	",model[count1]);
    
                    if((count1+1)%16==0||model[count1+1]=='')
                {
                    printf("
    ");
                    while(1)
                    {
                        printf("%x	",model[count2]);
                        count2++;
                        if(count2%16==0||model[count2]=='')
                            {
                            printf("
    ");
                            break;
                            }
                    }
                }
                count1++;
                if(model[count1]=='') break;
            }
        }
        fclose(fp1);
        return 0;
    }
    
    
    • 结果出现了很多问题,如果文本文件中只有一行文字可以实现,如果多输入几个回车就会出现很大的错误。

    • 对比Linux下的od命令有明显错误。

    • 询问结对同学张瑞琦(20155230)开始解决问题。

    • 重新编写代码将其分成主函数:打开文件、读取文件、输出文件内容、关闭文件。fx函数:将文件内容按16进制输出。

    • 修改之后不能输出 ,添加代码

    if(ch=='
    ')
                printf("  \n");
    
    • 输出没有以16字节换行 ,添加代码
    count++;
            if(count==16)
            {
    		printf("
    ");
    		count=0;
    	}
    
    • 不能转化为16进制的0a,之间编写代码fx函数中如果遇到 输出0a

    • 最后的成品代码如下

    void main(){
    
        char a[50];
        printf("od -tx -tc ");
        scanf("%s",a);
        FILE *fp;
        char ch;
        fp=fopen(a,"r");
        ch=fgetc(fp);
        printf("原文件输出为:
    ");
        int count=0;
        while(ch!=EOF)
        {
            if(ch=='
    ')
                printf("  \n");
            else
                printf("%4c",ch);
    	count++;
            if(count==16)
            {
    		printf("
    ");
    		count=0;
    	}
            ch=fgetc(fp);
        }
    
        printf("
    ");
        tx(a);
    }
    
    
    void tx(char *a)
    {
        FILE *fp;
        char ch;
        printf("16进制输出为:
    ");
        fp=fopen(a,"r");
        ch=fgetc(fp);
        int count=0;
        while(ch!=EOF)
        {
            if(ch=='
    ') 
                printf("  0a");
            else
                printf("%4x",ch);
    	count++;
    	if(count==16)
    	{
    		printf("
    ");
    		count=0;
    	}
            ch=fgetc(fp);
        }
        fclose(fp);
    }
    
    

    git结果:

    参考资料

    • 由于c语言文件基础较差,学习了有关文件的c语言函数。

    • 参考网上资料

    • 摘取比较常用的函数如下

    • fopen 函数说明:
      作用:用来打开一个文件
      格式:FILE * fopen(const char * path,const char * mode);
      返回值:打开文件成功返回一个文件指针,若打开文件失败则返回NULL

    • fclose 函数说明:
      作用:关闭一个文件流,释放文件指针
      格式:int fclose( FILE *fp );
      返回值:如果流成功关闭,fclose 返回 0,否则返回EOF

    • fgetc 函数说明:
      作用:从文件指针指向的文件流中读取一个字符,读取一个字节后,光标位置后移一个字节
      格式:int fgetc(FILE *stream);
      返回值:返回所读取的一个字节,如果读到文件末尾或者读取出错时返回EOF(EOF是文件结束标识符,一般值为-1)

    • fputc 函数说明:
      作用:将指定字符写到文件指针所指向的文件的当前写指针位置上
      格式:int fputc (char c, File *fp);
      返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF

    • fgets 函数说明:

    作用:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋''),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。
    格式:char *fgets(char *buf, int bufsize, FILE *stream);
    返回值:函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

  • 相关阅读:
    linux系统如何发送邮件
    zabbix监测图形界面显示方框乱码解决方法
    Eclipse C++的配置问题launch failed binary not found
    Cpu表现出正弦曲线
    让cpu跑到100%的bat文件
    进程僵死
    华为一些笔试题~~~~零散总结
    数据库~~~投影与除操作
    C++连接Mysql数据库操作
    微软面试题目及答案
  • 原文地址:https://www.cnblogs.com/lhyhahaha/p/7671003.html
Copyright © 2020-2023  润新知