c++ 文本文件替换问题!!!!!

fantcy 2009-09-02 10:56:57
本人想写一个修改exe文件内容的程序 思路是这样的首先把exe变成txt然后再用一下代码读取 读完后再写入信的exe文件
不知道怎么回事 读出的信息老是不全 而且当程序运行到::wsprintf(buff,"%s",chuli);这一句的时候还报错 不知道为什么请高手指点!!!!!!!!
#include <iostream.h>
#include <afx.h>
#include <string.h>
#include <windows.h>
#include <stdio.h>
int main()
{
CFile hie,hh;
CString chuli;
char buff[100]={0};
int s=0,a=0,b=0,n=0;
hie.Open("c:\\弹出.txt",CFile::modeReadWrite);
a=hie.GetLength();
while(s<a)
{
b=hie.Read(buff,sizeof(buff));
//cout<<buff<<endl;
chuli.Insert(0,buff);
n=chuli.Replace("4399","7000");
//cout<<chuli<<endl;
::wsprintf(buff,"%s",chuli);
hh.Open("c:\\xinwen.exe",CFile::modeCreate | CFile::modeWrite);
hh.SeekToEnd();
hh.Write(buff,1024);
hh.Close();
s=b+s;
}
hie.Close();
if(n!=0)
MessageBox(NULL,"successful!","nihao",MB_OK);
else
MessageBox(NULL,"error!","nihao",MB_OK);
return 1;
}
...全文
395 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fantcy 2009-09-08
  • 打赏
  • 举报
回复
结贴
bfzhao 2009-09-02
  • 打赏
  • 举报
回复
楼主看来是想从windwos 7 beta或者RC升级到windwos 7 RTM。你大可不必自己动手修改,找一个二进制编辑器,打开这个ISO文件,然后搜索4399,直接重写为7000即可。
fantcy 2009-09-02
  • 打赏
  • 举报
回复
谁能给段 源代码啊???
zhouzhipen 2009-09-02
  • 打赏
  • 举报
回复
这样不行,不要转成TXT的,用2进制,直接用一个CHAR数组装入文件,然后自己写字符串处理函数,不要以'\0'作为字串结束,以文件大小作为字串结束条件。
因为你现在用的所有字符串处理的库函数都是以‘\0’作结束条件。而EXE文件中'\0'这样的内容处处都有,所以会出错。
fantcy 2009-09-02
  • 打赏
  • 举报
回复
哦 谢谢
kakashi0309 2009-09-02
  • 打赏
  • 举报
回复
char* 可以直接转换成string的

char *ch = "Hello";
string str = ch;

字符数组的话可以考虑 strcpy(str.c_str(), ch);
fantcy 2009-09-02
  • 打赏
  • 举报
回复
大家 帮帮忙啊
给段代码 看看行不???
fantcy 2009-09-02
  • 打赏
  • 举报
回复
谢谢 大家的发言 嗯现在的问题是 我用二进制读出一个char后怎么把他转换成string并完成替换 给段代码好嘛 谢谢!
kakashi0309 2009-09-02
  • 打赏
  • 举报
回复
学会调试呀...
xingzhe2001 2009-09-02
  • 打赏
  • 举报
回复
看来楼主是对文本模式和binary模式理解混乱,这两个模式不是说你用文本模式读进来就是个char*, 用binary模式读进来就是个byte*, 读进来是什么事你自己转换的,文本模式也可以读进来float*, binary模式也可以读进来 char*.

文本模式会对"\a\d"这种数据,就是 10和13这两个二进制数做特殊处理,exe里面可能有这种数据正好是0x0A0D, 按文本模式读进来就不对了。
mstlq 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fantcy 的回复:]
引用 5 楼 fantcy 的回复:
这个 我知道 但是 我想 如果是二进制模式的 怎么能替换出这个chuli.Replace("4399","7000"); 呢????!!!!! 难道二进制也可以????

还是这个 问题二进制读出来后怎么能替换掉4399这个东西呢??
[/Quote]

楼主如果不放心,请自行写一个replace函数……
费不了几行代码……
xingzhe2001 2009-09-02
  • 打赏
  • 举报
回复
读进来你还是可以当字符串处理阿,只是保证读文件的函数不会对文件内容做什么改动。
fantcy 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fantcy 的回复:]
这个 我知道 但是 我想 如果是二进制模式的 怎么能替换出这个chuli.Replace("4399","7000"); 呢????!!!!! 难道二进制也可以????
[/Quote]
还是这个 问题二进制读出来后怎么能替换掉4399这个东西呢??
xingzhe2001 2009-09-02
  • 打赏
  • 举报
回复
改后缀名对文件内容没有任何影响,你还是需要用binary模式读,改后缀名对于用户可能看到文件格式变了,其实对文件没有任何影响。
fantcy 2009-09-02
  • 打赏
  • 举报
回复
这个 我知道 但是 我想 如果是二进制模式的 怎么能替换出这个chuli.Replace("4399","7000"); 呢????!!!!! 难道二进制也可以????
taodm 2009-09-02
  • 打赏
  • 举报
回复
呃,听说过binary模式没有?
fantcy 2009-09-02
  • 打赏
  • 举报
回复
哦 是我知道对不转换也可以 但是也是出错误 不知道为什么
xingzhe2001 2009-09-02
  • 打赏
  • 举报
回复
exe是binary文件,你需要open的时候用binary模式,要不然有些内容会被转换掉。
wuyu637 2009-09-02
  • 打赏
  • 举报
回复
exe文件可以直接读。不需要转换成txt文件
fantcy 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bfzhao 的回复:]
楼主看来是想从windwos 7 beta或者RC升级到windwos 7 RTM。你大可不必自己动手修改,找一个二进制编辑器,打开这个ISO文件,然后搜索4399,直接重写为7000即可。
[/Quote]
谢谢 您的提醒 不过 我发现了一见很有趣的事 请看我帖子
http://topic.csdn.net/u/20090902/13/21a179e2-1b01-4dac-8456-c0affa6ab7a4.html

64,654

社区成员

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

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