求大虾帮忙写个简单的数字文件比较程序(C++编写)

MrBone 2009-05-24 10:43:35
求牛人帮忙写一小程序,小弟从来没有接触过位比较的问题,实在是写不出来了~
要求:从两个TXT文件中读取数字(数字间有对应的空格和小数点),将数字按位计较,如发现不同的位,输出是第几位,计算比较的时间,并把第几位开始不同和程序的运行时间写到第三个个TXT文件中。

我朋友帮忙写了个JAVA的程序,代码如下,希望有所帮助。

import java.io.*;
import java.util.regex.*;

public class FileCompare {
public static void main(String[] args) {

//读取两个文件内容到字符数组中
char[] c1 = ReadFile.read("F://1.txt");
char[] c2 = ReadFile.read("F://2.txt");

int a = c1.length > c2.length ? c2.length : c1.length;
//b为第一个不同处的位置
int b = 0;

for(int i=0; i<a; i++) {
if(c1[0] == c1[0]) {
if(c1[i] != c2[i]) {
System.out.println("小数点后第" + i + "位不相同");
}
} else {
System.out.println("第1位不相同!");
}
}
}
}

class ReadFile {
public static char[] read(String filename) {

File f = new File(filename);

StringBuilder sb = new StringBuilder();
BufferedReader br = null;
String str = new String();

try {
br = new BufferedReader(new FileReader(f));
} catch(FileNotFoundException e) {
System.out.println("File not found!");
System.exit(-1);
}

try {
while((str = br.readLine()) != null) {
sb.append(str);
}
} catch(IOException e) {
e.printStackTrace();
}

str = trim(sb.toString());
//System.out.println(str);
return str.toCharArray();
}

public static String trim(String str) {
str = str.replace(".", "")
str = str.replaceAll(" ", "");
return str;
}
}
...全文
315 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
papaofdoudou 2009-05-25
  • 打赏
  • 举报
回复
不知道我理解错误没有,你的位是二进制的位还是十进制数字中的位?
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include <time.h>
#include <fstream.h>
#include<iostream.h>


void main()
{
clock_t time1,time2;
time1=clock();
int k=0,j=0,i=0,count=1;
FILE *fp1,*fp2,*fp3;
char c;
char ch[100],ch1[100];

if((fp1=fopen("a.txt","r"))!=NULL)
{
while(!(feof(fp1)))
{
fscanf(fp1,"%c",&c);
if((c>=48)&&(c<=57))
{
ch[k++]=c;
}

}
ch[k]='\0';
}

cout<<ch<<endl;
k=0;
if((fp2=fopen("b.txt","r"))!=NULL)
{
while(!(feof(fp2)))
{
fscanf(fp2,"%c",&c);
if((c>=48)&&(c<=57))
{
ch1[k++]=c;
}

}
ch1[k]='\0';
}

cout<<ch1<<endl;


i=strlen(ch)<strlen(ch1)? strlen(ch):strlen(ch1);
int min=100;

for(j=0;j<i;j++)
{
if(ch[j]!=ch1[j])
{
if(min>j)
min=j;
cout<<"第"<<j+1<<"个数字不等"<<endl;
}

}



time2=clock();

printf ("The time was:%ld\n", time2-time1); //单位毫秒,本程序测试还不到1ms,所以显示0

ofstream file("C:\c.txt");

file<<"从第"<<min+1<<"开始不等"<<endl<<"程序运行"<<time2-time1<<"ms"<<endl;

}
papaofdoudou 2009-05-25
  • 打赏
  • 举报
回复
不知道我理解错误没有,你的位是二进制的位还是十进制数字中的位?
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include <time.h>
#include <fstream.h>
#include<iostream.h>


void main()
{
clock_t time1,time2;
time1=clock();
int k=0,j=0,i=0,count=1;
FILE *fp1,*fp2,*fp3;
char c;
char ch[100],ch1[100];

if((fp1=fopen("a.txt","r"))!=NULL)
{
while(!(feof(fp1)))
{
fscanf(fp1,"%c",&c);
if((c>=48)&&(c<=57))
{
ch[k++]=c;
}

}
ch[k]='\0';
}

cout<<ch<<endl;
k=0;
if((fp2=fopen("b.txt","r"))!=NULL)
{
while(!(feof(fp2)))
{
fscanf(fp2,"%c",&c);
if((c>=48)&&(c<=57))
{
ch1[k++]=c;
}

}
ch1[k]='\0';
}

cout<<ch1<<endl;


i=strlen(ch)<strlen(ch1)? strlen(ch):strlen(ch1);
int min=100;

for(j=0;j<i;j++)
{
if(ch[j]!=ch1[j])
{
if(min>j)
min=j;
cout<<"第"<<j+1<<"个数字不等"<<endl;
}

}



time2=clock();

printf ("The time was:%ld\n", time2-time1); //单位毫秒,本程序测试还不到1ms,所以显示0

ofstream file("C:\c.txt");

file<<"从第"<<min+1<<"开始不等"<<endl<<"程序运行"<<time2-time1<<"ms"<<endl;

}
acrobatyuer 2009-05-25
  • 打赏
  • 举报
回复
路过而已
liliangbao 2009-05-25
  • 打赏
  • 举报
回复
帮顶!!!
lzh9955 2009-05-25
  • 打赏
  • 举报
回复
顶!
mengde007 2009-05-25
  • 打赏
  • 举报
回复
路过;
梅文海 2009-05-25
  • 打赏
  • 举报
回复
这么简单的问题建议自己写,也算是熟悉一下位操作是怎么回事
至于如何打开文件以及如何提取数字不用我说了吧,我就简单的说一下如何进行位比较
首先你得到源文件的数字 a1,然后得到目标文件的数字a2,然后a1和a2取异或值
得到的值为 1 的部分都是不同的位,为0则表示相同
然后把该数转换为字符串直接保存就可以了
chenzhp 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shexinwei 的回复:]
虽说是数字按位比较,实际上还是按照字符来处理,如果要读如连续的数字,但要实现按位比较,只能够用字符读取;
程序中只是做比较,不要计算,LZ完全可以按照字符来处理即可
[/Quote]
shexinwei 2009-05-25
  • 打赏
  • 举报
回复
虽说是数字按位比较,实际上还是按照字符来处理,如果要读如连续的数字,但要实现按位比较,只能够用字符读取;
程序中只是做比较,不要计算,LZ完全可以按照字符来处理即可
MrBone 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 tugouxp 的回复:]
两个完全相同的文件当然是101位不同了啊,我定义的 ch数组只有100个啊,文件相同,前100个肯定相同啊,这个只是示例,算法还有好多不完善的地方,楼主可以自己想想嘛
[/Quote]

这个问题解决了……谢啦~~

随之而来的新问题是我把两个完全相同文件的其中一个文件的一个任意数字改了,但程序检测不出来……
(我的数字都是十进制的)
xqls_xqls 2009-05-25
  • 打赏
  • 举报
回复
如果上述java程序是对的,,那把其中的函数替换成相应的C++函数不就行了
自己试试
papaofdoudou 2009-05-25
  • 打赏
  • 举报
回复
两个完全相同的文件当然是101位不同了啊,我定义的 ch数组只有100个啊,文件相同,前100个肯定相同啊,这个只是示例,算法还有好多不完善的地方,楼主可以自己想想嘛
MrBone 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tugouxp 的回复:]
不知道我理解错误没有,你的位是二进制的位还是十进制数字中的位?
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <fstream.h>
#include <iostream.h>


void main()
{
clock_t time1,time2;
time1=clock();
int k=0,j=0,i=0,count=1;
FILE *fp1,*fp2,*fp3;
char c;
char ch[100],ch1[100];

if((fp1=fopen("a.txt","r"))!=NUL…
[/Quote]

warning C4129: 'c' : unrecognized character escape sequence
warning C4101: 'fp3' : unreferenced local variable

麻烦帮忙看下,我把FILE *fp1,*fp2,*fp3; 中的*fp3直接删除了,运行以后的结果总是地101位出现不同,两个完全相同的文件都不行……麻烦再帮忙看下……谢了~
lishaohua23 2009-05-25
  • 打赏
  • 举报
回复
顶一个
msdn2009_2010 2009-05-25
  • 打赏
  • 举报
回复
pathuang68 2009-05-25
  • 打赏
  • 举报
回复
顶一个
光宇广贞 2009-05-25
  • 打赏
  • 举报
回复
顶一个。
papaofdoudou 2009-05-25
  • 打赏
  • 举报
回复
yun,发了两次,就当给楼主顶了
  • 打赏
  • 举报
回复
去下个类似的ftoa函数源码,把float转为char型数据,接下来就好比较了。

内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧