博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux下c语言实现myod
阅读量:4356 次
发布时间:2019-06-07

本文共 3033 字,大约阅读时间需要 10 分钟。

  • 首先根据od要输出16进制的功能,以及c语言中文件的打开读取等函数,编写了如下代码。
#include
#define N 1000int 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]!='\0') number++; while(1) { printf("%c\t",model[count1]); if((count1+1)%16==0||model[count1+1]=='\0') { printf("\n"); while(1) { printf("%x\t",model[count2]); count2++; if(count2%16==0||model[count2]=='\0') { printf("\n"); break; } } } count1++; if(model[count1]=='\0') break; } } fclose(fp1); return 0;}
  • 结果出现了很多问题,如果文本文件中只有一行文字可以实现,如果多输入几个回车就会出现很大的错误。
  • 1071485-20171015143119262-563737867.png

  • 对比Linux下的od命令有明显错误。
  • 1071485-20171015143125402-562350997.png

  • 询问结对同学张瑞琦(20155230)开始解决问题。
  • 重新编写代码将其分成主函数:打开文件、读取文件、输出文件内容、关闭文件。fx函数:将文件内容按16进制输出。
  • 1071485-20171015143143402-1250924731.png

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

if(ch=='\n')            printf("  \\n");
  • 1071485-20171015143202402-1803860695.png
  • 输出没有以16字节换行 ,添加代码
count++;        if(count==16)        {        printf("\n");        count=0;    }
  • 1071485-20171015143454824-1192474511.png

  • \n不能转化为16进制的0a,之间编写代码fx函数中如果遇到\n输出0a
  • 1071485-20171015143505871-1598710481.png

  • 最后的成品代码如下

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

git结果:1071485-20171015143517715-103815821.png

参考资料

  • 由于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个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。

格式:char fgets(char buf, int bufsize, FILE *stream);
返回值:函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

转载于:https://www.cnblogs.com/lhyhahaha/p/7671003.html

你可能感兴趣的文章
自定义控件之---抽屉式弹窗控件.
查看>>
一款纯css3实现的机器人看书动画效果
查看>>
加班与效率
查看>>
轻量级Modal模态框插件cta.js
查看>>
MyEclipse下SpringBoot+JSP整合过程及踩坑
查看>>
重定向和管道
查看>>
实验五
查看>>
STL学习笔记(第二章 C++及其标准程序库简介)
查看>>
Operator_countByValue
查看>>
Java 日期往后推迟n天
查看>>
Web应用漏洞评估工具Paros
查看>>
Git 和 Github 使用指南
查看>>
20180925-4 单元测试
查看>>
mysql的数据存储
查看>>
[转载] Activiti Tenant Id 字段释疑
查看>>
[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
查看>>
SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
查看>>
最小权限的挑战
查看>>
jquery 视觉特效(水平滚动图片)
查看>>
SVG笔记
查看>>