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]!='\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;
}
结果出现了很多问题,如果文本文件中只有一行文字可以实现,如果多输入几个回车就会出现很大的错误。

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

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

修改之后不能输出\n,添加代码
if(ch=='\n')
printf(" \\n");

- 输出没有以16字节换行 ,添加代码
count++;
if(count==16)
{
printf("\n");
count=0;
}

\n不能转化为16进制的0a,之间编写代码fx函数中如果遇到\n输出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("原文件输出为:\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结果:
参考资料
由于c语言文件基础较差,学习了有关文件的c语言函数。
摘取比较常用的函数如下
fopen 函数说明:
作用:用来打开一个文件
格式:FILE * fopen(const char * path,const char * mode);
返回值:打开文件成功返回一个文件指针,若打开文件失败则返回NULLfclose 函数说明:
作用:关闭一个文件流,释放文件指针
格式:int fclose( FILE *fp );
返回值:如果流成功关闭,fclose 返回 0,否则返回EOFfgetc 函数说明:
作用:从文件指针指向的文件流中读取一个字符,读取一个字节后,光标位置后移一个字节
格式:int fgetc(FILE *stream);
返回值:返回所读取的一个字节,如果读到文件末尾或者读取出错时返回EOF(EOF是文件结束标识符,一般值为-1)fputc 函数说明:
作用:将指定字符写到文件指针所指向的文件的当前写指针位置上
格式:int fputc (char c, File *fp);
返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOFfgets 函数说明:
作用:从文件结构体指针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函数来判断。
Linux下c语言实现myod的更多相关文章
- 20155322 2017-2018-1《信息安全系统设计》第二周 课堂测试 Linux下C语言实现MYOD
20155322 2017-2018-1<信息安全系统设计>第二周 课堂测试 Linux下C语言实现MYOD [博客目录] 静态库测试 实现方法 相关资料 操作 动态库测试 实现方法 相关 ...
- linux 下C语言学习路线
UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- LINUX下中文语言包的安装(转)
在安装盘上已经有各种语言包了,我们只需要找到他们,并安装就可以了.中文的是fonts-chinese-3.02-9.6.el5.noarch.rpmfonts-ISO8859-2-75dpi-1.0- ...
- Unix和Linux下C语言学习指南
转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...
- 笔记整理——Linux下C语言正则表达式
Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论 ...
- linux下常用语言的语法检查插件整理
linux下常用语言的语法检查插件 可以结合vim语法检查插件syntastic使用,具体请参考syntastic使用说明 如php,sql,json,css,js,html,shell,c等语法插件 ...
随机推荐
- December 08th 2016 Week 50th Thursday
Life is a test and this world a place of trial. 人生是一场考试,这个世界就是考场. I have not passed the test yet. I ...
- scala当中的对象
1.scala当中的Object 在scala当中,没有类似于像java当中的static修饰的静态属性或者静态方法或者静态代码块之类的,但是我们可以通过scala当中的Object来实现类似的功能. ...
- jq实现鼠标经过出现上拉菜单
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- angularJs的作用域和依赖注入
一.angularJs的作用域 &scope这是局部作用域,先在局部作用域中找,如果没有就在全局作用域中找 &rootScope这是全局作用域 <!DOCTYPE HTML&g ...
- shell脚本执行
方法一:切换到shell脚本所在的目录执行shell脚本: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应 ...
- PAT——1024. 科学计数法
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位 ...
- DPDK运行出现EAL Error reading from file descriptor 23 Input output error
原因 dpdk不支持该网卡导致,需要修改一行代码,跳过dpdk pci 检查. 解决方法 修改lib/librte_eal/linuxapp/igb_uio/igb_uio.c 将文件中该行修改 pc ...
- spring boot 配置Rabbit
单独安装Rabbit服务并设置启动,可以通过浏览器访问,一般访问地址是http://localhost:15672/ ,用户名密码看配置文件的用户名密码 1 实例化配置类注解 import org.s ...
- Oracle索引实现方式
- #leetcode刷题之路16-最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...