帮我看看,一个C的题目

llf_hust 2005-07-26 05:19:36
读取一个二进制文件, 将文件中相邻的重复字节合并为一个字节, 并输出到另一个文件中.
如 01 02 03 04 05 05 05 06 07 08 08 08 09 - > 01 02 03 04 05 06 07 08 09
...全文
261 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mic_c 2005-07-27
  • 打赏
  • 举报
回复
到处看看,到处学学,到处转转
99 2005-07-27
  • 打赏
  • 举报
回复
就是,楼主想干什么呐?
boxban 2005-07-27
  • 打赏
  • 举报
回复

原文件单行如下所示:
"在 C:\81536B25EC38CA52E1B07D4F42B2B3A7.dll 中发现 Trojan/PSW.Lineage.eg.Hook.b 病毒, 发现病毒"

输出到目标文件如下:
"C:\81536B25EC38CA52E1B07D4F42B2B3A7.dll Trojan/PSW.Lineage.eg.Hook.b"

这个程序该怎么写,给个思路

###将文件中相邻的重复字节合并为一个字节###
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"dll" "hook" 为什么没有变成“dl" "hok"呢?反倒是那些汉字全都丢掉了。楼主到底要实现什么?

KenYuan2016 2005-07-27
  • 打赏
  • 举报
回复
替换:
不知道文件的大小,所以
按定长读取到数组中,数组转换就比较简单了。
用循环.
zhousct 2005-07-26
  • 打赏
  • 举报
回复
读一个字节,写入文件,并保存起来,再读一个字节,先比较再觉得写入文件与否。
LoveYouJustOneDay 2005-07-26
  • 打赏
  • 举报
回复
原文件单行如下所示:
"在 C:\81536B25EC38CA52E1B07D4F42B2B3A7.dll 中发现 Trojan/PSW.Lineage.eg.Hook.b 病毒, 发现病毒"

输出到目标文件如下:
"C:\81536B25EC38CA52E1B07D4F42B2B3A7.dll Trojan/PSW.Lineage.eg.Hook.b"

这个程序该怎么写,给个思路


用宽字符
wchar_t
LoveYouJustOneDay 2005-07-26
  • 打赏
  • 举报
回复
罗来富看这个

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fp1, *fp2;
char ch, pre;

fp1 = fopen("test", "wb");
while(1)
{
scanf("%d", &ch);
if(!ch) break;
fputc(ch, fp1);
}
fclose(fp1);

fp1 = fopen("test", "rb");
fp2 = fopen("test2", "wb");
ch=pre=fgetc(fp1);
fputc(ch, fp2);

while(1)
{
ch=fgetc(fp1);
if(feof(fp1))
break;
if(ch!=pre)
{
pre=ch;
fputc(ch, fp2);
}
}
fclose(fp1);
fclose(fp2);

system("PAUSE");
return 0;
}
softheaven 2005-07-26
  • 打赏
  • 举报
回复
// 本文来自铁道P246,;我不是想解决这道题的。我写了个摸拟的栈---类。
//还请高手修改一下不错之处,指点一下我在此编程中,暴露出的问题。谢了我先有礼了
//设计一个栈结构体的类,栈内存放的数据是三个字母的字符串(AAA,BCC,ABZ,KIS..)
//数据成员包括栈本身(stack),栈大小(size),及目前顶端位(top);
//成员函数则可以处埋栈内的数据引用,包括加入栈add(),从堆栈中删除delete(),
//检查堆栈是否已满IsFull(),检查堆栈是否已空等IsEmpty(),当然还有构造函数。
//测试时,可以写一段主程序main(),定义一个栈象,并对此对像做加入堆栈,
//删除栈的操作,提示:加入堆栈时,要考栈是否已满,且必须维护值保特在顶端的位置;
//删除栈时,则要考虑栈是否已空,并维护值在顶端位置
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#define FALSE -1
#define TURE 1
class stack
{
public:
stack(int sizeofstack);//构造函数
~stack();//析构函数
int ISFULL(class stack );
int ISEMPTY(class stack); //判断栈中是否为空
void COUTSTACKPT(class stack stacksample);//显示栈的内容
void ADD(char * str); //入栈操作
void POP(class stack stacksample); //弹栈操作
private:
char * stackpoint[20]; //指针数组
int size;
int top;
};
void stack::POP(class stack stacksample) //弹栈操作
{
if(ISEMPTY(stacksample)==FALSE)
{
top--;
}
}
void stack::ADD(char * str) //入栈操作
{

top++;
strcpy(stackpoint[top],str);
}
int stack::ISEMPTY(class stack stacksample)//判断栈是否为空
{
if(top>=0) {return FALSE;}
else {cout <<endl<<"stack is empty";return( TURE);}
}
void stack::COUTSTACKPT(class stack stacksample)//先判断后显示栈的内容
{
if( ISEMPTY(stacksample)==FALSE ) {cout<<stackpoint[top]<<endl;}
else {cout<<"the stack is empty"<<endl;}
}
stack::stack(int sizeofstack )//构造函数申请栈空间
{
int i;
top=-1;
for(i=0;i<sizeofstack;i++)
stackpoint[i]= (char * )new char [i][100];
}

stack::~stack()//析构函数
{
top=-1;
}
void main()
{
int i,stacksize;//初始申请栈的大小
char stacktemp[80];
cout<< "enter the stack's size please :";
cin>>stacksize;
stack t1(stacksize); //构造函数申请栈空间
t1.COUTSTACKPT(t1); //先判断后显示栈内容
for(i=0;i<stacksize;i++) // 入栈
{
cout<<" enter string please :";
cin>> stacktemp;
t1.ADD(stacktemp);
}
cout<<"Befor first pop"<<endl;
t1.COUTSTACKPT(t1);
t1.POP(t1);
cout<<"After pop"<<endl;
t1.COUTSTACKPT(t1);
t1.POP(t1);
cout<<"After pop again"<<endl;
t1.COUTSTACKPT(t1);
t1.POP(t1);
cout<<"After pop 3th"<<endl;
t1.COUTSTACKPT(t1);
t1.POP(t1);
cout<<"After pop 4th"<<endl;
t1.COUTSTACKPT(t1);
}
llf_hust 2005-07-26
  • 打赏
  • 举报
回复
原文件单行如下所示:
"在 C:\81536B25EC38CA52E1B07D4F42B2B3A7.dll 中发现 Trojan/PSW.Lineage.eg.Hook.b 病毒, 发现病毒"

输出到目标文件如下:
"C:\81536B25EC38CA52E1B07D4F42B2B3A7.dll Trojan/PSW.Lineage.eg.Hook.b"

这个程序该怎么写,给个思路
llf_hust 2005-07-26
  • 打赏
  • 举报
回复
哪个写出源代码来呀
LoveYouJustOneDay 2005-07-26
  • 打赏
  • 举报
回复
罗来富大哥
我说的对不对啊
LoveYouJustOneDay 2005-07-26
  • 打赏
  • 举报
回复
不相邻的更简单了

用一个数组

int hash[256];
memset(hash, 0, 256*sizeof(int) );

然后读取每一个字节( unsigned 类型读取) ch
if(!hash[ch])
输出到另外一个文件;
hash[ch]++;


最后各种字节出现的次数都统计下来了
jsjjms 2005-07-26
  • 打赏
  • 举报
回复
不知道是不是我没有考虑周全,没有看出特别 复杂的地方呀????

设一个临时变量,每次读取一个,拷贝一个副本到临时变量中,

继续读的时候与副本比较,相同丢弃,不相同写入。

firstdreamer 2005-07-26
  • 打赏
  • 举报
回复
mark
jixingzhong 2005-07-26
  • 打赏
  • 举报
回复
相邻的重复字节合并为一个字节




不考虑不相邻的重复情况的话

可以简单些

字节读取

判断比较

存入缓存

最后写入文件..




没有记错的话

楼主应该参加了一个 网络工程师 的面试了吧?

好象是的哦

呵呵
LoveYouJustOneDay 2005-07-26
  • 打赏
  • 举报
回复
设置一个 pre 标志
先读取第一个,并写入第二个文件
然后 pre = 第一个;

之后读取文件里剩下的所有字节
对于每个字节 now
{
if(now!=pre)
{
写入另外一个文件;
pre = now;
}

}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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