C/c++程序求助,实现2个hex文件的比较
比较2个hex文件(INTEL16进制文件),将2个文件逐字节比较,并将结果存为第三个hex文件(如果相同结果显示为"00",如果不同显示为"FF"),用c或者c++实现...
比较2个hex文件(INTEL 16进制文件),将2个文件逐字节比较,并将结果存为第三个hex文件(如果相同结果显示为"00",如果不同显示为"FF"),用c或者c++实现。
展开
展开全部
打开这些数据 然后将文件内容转换成数组 在这里 我帮你用的是二维数组 如果你不想用二维数组保存 可以修改一下 大体都一致的
另外,我用的方法中,读取文件用的是C语言的方法 其实和C++一样的 只不过后者是对象化的操作 你要是不想用C的 可以更改其中的文件操作函数成C++
最近在做编译器 对于文件的读写的各种操作都比较熟悉 今天无意中看到你的问题 随便就拿来做了 有些地方和过程可以更细化 不过我没时间 有什么不懂或者特别要求 可以直接找我 方式很简单 直接用百度的这个号给我发信息就行了
考虑到你的要求不够具体 我没有将最后的1 2 3什么的编号去掉 另外 我这个小程序可以读取所有这种数据格式 如果你要去掉最后的编号 可以自己加入去除代码或找我帮忙
还有一点提示你,以后如果要做这方面的工作,学会对文件的操作和各种不同样式的内容的特殊处理操作是很有很必要的 特别是编译器方面的工作 你可以学习编译原理这一门功课 它几乎汇集了各种文件操作和结构算法等等方面的知识 更是对计算机程序的一个深入
以下是代码(代码很简单短小 收集在一个文件中 直接用VC6建个C++的普通DOS工程粘贴过去就能运行了 另外 如果直接复制进VC6有混乱和无法识别的字符 请自己慢慢修改一下 把所有注释弄到一行中 在我这里是完全能够运行 并很美观的 如果还是不行 直接找我 我发文件给你)
///////////////////////////////////////
//////////////
//////////////2010-1-16 tt
//////////////
///////////////////////////////////////
#define MAX_H 10 //能够读取的最多行数
#define MAX_L 10 //能够读取的最多列数
#define MAX_NUM 10 //临时字符串数组最大值(可支持的小数点有效长度) 要求:以上三个数值必须大于或等于实际最大用量
#include<iostream>
using namespace std;
int main()
{
char file[100]; //打开文件目录变量
FILE *pfile;
cout<<"请输入你要打开的文件目录和文件名"<<endl;
cin>>file;
pfile=fopen(file,"r");
// pfile=fopen("1.txt","r"); //这里不必理会 如果注释掉前三行 再取消这行的注释 默认打开的文件就是工程目录下的1.txt
if(pfile==NULL)
else
{
float m_a[MAX_H][MAX_L]; //最终所有数据将保存进此二维数组中
int n=0; //临时的当前读到的字符串长度
int h=0; //对应的行
int l=0; //对应的列
char ch=getc(pfile); //开始读取第一个字符
while(ch!=EOF) //读取内容 直到文件结束
{
char str[MAX_NUM]=""; //格式化为浮点数前的临时字符串数组变量(此变量需要自动清空)
while(1) //这里可以自行更改 我定义成了无限循环(当然,下面有跳出循环语句,否则是死循环)
{ //此下的过程方法有几种 可以自己更改 这里用了最简单明了的一种
if(ch==' ') //当遇上空格时 停止读取
{
m_a[h][l]=atof(str); //并将读取到的内容用标准的字符串转换浮点数函数转换并保存进结果的二维数组中
n=0; //保存完成后 将字符串下标恢复到0
l++; //保存完成后 将二维数组中列数加1 等待下次的数据加入新列数组中
ch=getc(pfile); //读取下一字符
break; //退出循环 使得中间字符串归空
}
else if(ch=='\n') //当遇到回车时 (情况类同上面的遇上空格)
{
m_a[h][l]=atof(str);
n=0;
l=0;
h++; //这里的不同是 回车之后 要将二维数组的行数加1,就是前标前1
ch=getc(pfile);
break;
}
else if(ch==EOF)
{
m_a[h][l]=atof(str);
n=0;
l=0;
h++; //与回车不同的是 遇到结束符后 不再读取内容 也就没了getc操作了
break;
}
else //如果不是空格也不是回车也不是结束时量中
{
str[n]=ch; //将读取到的字符内容保存在临时的字符串中 等待遇上以上某种情况后处理并保存进数组变
ch=getc(pfile); //继续读取字符
n++; //字符串数组下标加1 以便下一字符加入进来
}
}
}
//以下用于测试结果`` //想有更多功能内容 应该在此后加入
for(int i=0;i<=6;i++)
{
for(int j=0;j<=8;j++)
{
cout<<m_a[i][j]<<" ";
}
cout<<endl;
}
fclose(pfile); //关闭读取的文件
}
return 0;
}
另外,我用的方法中,读取文件用的是C语言的方法 其实和C++一样的 只不过后者是对象化的操作 你要是不想用C的 可以更改其中的文件操作函数成C++
最近在做编译器 对于文件的读写的各种操作都比较熟悉 今天无意中看到你的问题 随便就拿来做了 有些地方和过程可以更细化 不过我没时间 有什么不懂或者特别要求 可以直接找我 方式很简单 直接用百度的这个号给我发信息就行了
考虑到你的要求不够具体 我没有将最后的1 2 3什么的编号去掉 另外 我这个小程序可以读取所有这种数据格式 如果你要去掉最后的编号 可以自己加入去除代码或找我帮忙
还有一点提示你,以后如果要做这方面的工作,学会对文件的操作和各种不同样式的内容的特殊处理操作是很有很必要的 特别是编译器方面的工作 你可以学习编译原理这一门功课 它几乎汇集了各种文件操作和结构算法等等方面的知识 更是对计算机程序的一个深入
以下是代码(代码很简单短小 收集在一个文件中 直接用VC6建个C++的普通DOS工程粘贴过去就能运行了 另外 如果直接复制进VC6有混乱和无法识别的字符 请自己慢慢修改一下 把所有注释弄到一行中 在我这里是完全能够运行 并很美观的 如果还是不行 直接找我 我发文件给你)
///////////////////////////////////////
//////////////
//////////////2010-1-16 tt
//////////////
///////////////////////////////////////
#define MAX_H 10 //能够读取的最多行数
#define MAX_L 10 //能够读取的最多列数
#define MAX_NUM 10 //临时字符串数组最大值(可支持的小数点有效长度) 要求:以上三个数值必须大于或等于实际最大用量
#include<iostream>
using namespace std;
int main()
{
char file[100]; //打开文件目录变量
FILE *pfile;
cout<<"请输入你要打开的文件目录和文件名"<<endl;
cin>>file;
pfile=fopen(file,"r");
// pfile=fopen("1.txt","r"); //这里不必理会 如果注释掉前三行 再取消这行的注释 默认打开的文件就是工程目录下的1.txt
if(pfile==NULL)
else
{
float m_a[MAX_H][MAX_L]; //最终所有数据将保存进此二维数组中
int n=0; //临时的当前读到的字符串长度
int h=0; //对应的行
int l=0; //对应的列
char ch=getc(pfile); //开始读取第一个字符
while(ch!=EOF) //读取内容 直到文件结束
{
char str[MAX_NUM]=""; //格式化为浮点数前的临时字符串数组变量(此变量需要自动清空)
while(1) //这里可以自行更改 我定义成了无限循环(当然,下面有跳出循环语句,否则是死循环)
{ //此下的过程方法有几种 可以自己更改 这里用了最简单明了的一种
if(ch==' ') //当遇上空格时 停止读取
{
m_a[h][l]=atof(str); //并将读取到的内容用标准的字符串转换浮点数函数转换并保存进结果的二维数组中
n=0; //保存完成后 将字符串下标恢复到0
l++; //保存完成后 将二维数组中列数加1 等待下次的数据加入新列数组中
ch=getc(pfile); //读取下一字符
break; //退出循环 使得中间字符串归空
}
else if(ch=='\n') //当遇到回车时 (情况类同上面的遇上空格)
{
m_a[h][l]=atof(str);
n=0;
l=0;
h++; //这里的不同是 回车之后 要将二维数组的行数加1,就是前标前1
ch=getc(pfile);
break;
}
else if(ch==EOF)
{
m_a[h][l]=atof(str);
n=0;
l=0;
h++; //与回车不同的是 遇到结束符后 不再读取内容 也就没了getc操作了
break;
}
else //如果不是空格也不是回车也不是结束时量中
{
str[n]=ch; //将读取到的字符内容保存在临时的字符串中 等待遇上以上某种情况后处理并保存进数组变
ch=getc(pfile); //继续读取字符
n++; //字符串数组下标加1 以便下一字符加入进来
}
}
}
//以下用于测试结果`` //想有更多功能内容 应该在此后加入
for(int i=0;i<=6;i++)
{
for(int j=0;j<=8;j++)
{
cout<<m_a[i][j]<<" ";
}
cout<<endl;
}
fclose(pfile); //关闭读取的文件
}
return 0;
}
展开全部
#include <stdio.h>
#include <stdlib.h>
#define FSIZE 10
int main()
{
char file1[FSIZE], file2[FSIZE], ch_out;
int ch1, ch2;
int flag = 1;/*1代表相同,0代表不同,默认先置一*/
FILE *fp1, *fp2, *out;
printf("Please input the file name : \n");
printf("FILE1 : ");
scanf("%s", file1);
printf("FILE2 : ");
scanf("%s", file2);
if((fp1 = fopen(file1, "rb")) == NULL)
{
printf("Cann't open %s", file1);
exit(1);
}
if((fp2 = fopen(file2, "rb")) == NULL)
{
printf("Cann't open %s", file2);
exit(1);
}
while((ch1 = getc(fp1)) != EOF)
{
if((ch2 = getc(fp2)) != EOF)
{
if(ch1 != ch2)
{
flag = 0;
break;
}
}
else
{
flag = 0;
break;
}
}
if(flag && (ch2 = getc(fp2)) != EOF)
flag = 0;
if((out = fopen("out.hex", "wb")) == NULL)
{
printf("Cann't open out file\n");
exit(1);
}
if(flag)
{
ch_out = '\0';
}
else
{
ch_out = '\xff';
}
fwrite(&ch_out, sizeof(char), 1, out);
fclose(fp1);
fclose(fp2);
fclose(out);
return 0;
}
#include <stdlib.h>
#define FSIZE 10
int main()
{
char file1[FSIZE], file2[FSIZE], ch_out;
int ch1, ch2;
int flag = 1;/*1代表相同,0代表不同,默认先置一*/
FILE *fp1, *fp2, *out;
printf("Please input the file name : \n");
printf("FILE1 : ");
scanf("%s", file1);
printf("FILE2 : ");
scanf("%s", file2);
if((fp1 = fopen(file1, "rb")) == NULL)
{
printf("Cann't open %s", file1);
exit(1);
}
if((fp2 = fopen(file2, "rb")) == NULL)
{
printf("Cann't open %s", file2);
exit(1);
}
while((ch1 = getc(fp1)) != EOF)
{
if((ch2 = getc(fp2)) != EOF)
{
if(ch1 != ch2)
{
flag = 0;
break;
}
}
else
{
flag = 0;
break;
}
}
if(flag && (ch2 = getc(fp2)) != EOF)
flag = 0;
if((out = fopen("out.hex", "wb")) == NULL)
{
printf("Cann't open out file\n");
exit(1);
}
if(flag)
{
ch_out = '\0';
}
else
{
ch_out = '\xff';
}
fwrite(&ch_out, sizeof(char), 1, out);
fclose(fp1);
fclose(fp2);
fclose(out);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
上面的代码好长啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询