【求助】麻烦会用c语言实现2进制流文件读写的朋友帮帮忙

o大耳鼠o 2008-01-13 07:42:23
我想编写一个c程序,能够实现如下功能:
输入:本程序名 目标文件名 offset 实现功能:以16进制的方式查看目标文件的offset处的代码

输入:本程序名 目标文件名 offset 16进制数据 实现功能:将16进制数据写入到offset指定处

我试着写了一下,总是不能成功。以下是我写的代码,我是想先看看能否实现第一个功能,但是,

就是不能成功,麻烦会这个的朋友帮着看看,谢谢了

#include <stdio.h>

main(int argc, char *argv[]) {
FILE *fp;
char *content;
printf("%d\n", argc);
printf("%s\n", argv[0]);
printf("%s\n", argv[1]);
printf("%s\n", argv[2]);
printf("%s\n", argv[3]);
if ((fp = fopen(argv[1], "ab+")) != NULL) {
if (argc == 3) {
fseek(fp, (long)argv[2], 0);
fread(content, 1, 1, fp)
printf("%x", content);
} else if (argc == 4) {

}
} else {
printf("can't open settings.sav");
}
fclose(fp);
return 0;
}
谢谢大家了。
...全文
260 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltc_mouse 2008-01-14
  • 打赏
  • 举报
回复
%x只是按照16进制显示,如果希望填充,可以加0;即使用%02x这个表示16进制显示,宽度为2,不足2位时用0填充;类似的,%0nd,表示n位10进制整数,不足时用0填充

fopen抛出异常?这个我没注意过。如果是fp得到NULL,正确的做法是在程序中判断,并给出提示,然后退出程序。这样,就不会得到操作系统的访问保护提示了。判断可以很简单的这样:
if(NULL==fp){
printf("Open file error.\n");
return -1; /* 或者使用exit(-1)等退出执行 */
}

结贴方法:点击 左下角(或者左上角)的“管理帖子”,进入后,给你认为有贡献的分配分数,然后右上角输入密码,点击“结贴”就可以了~
o大耳鼠o 2008-01-14
  • 打赏
  • 举报
回复
對了,還有一個最重要的問題,就是:fp = fopen(argv[1], "rb+"); 有可能抛出一個NULL異常,雖然在非NT環境下(Dos,95,98,ME,也就是2000之前的)都沒有什麽問題,但是到了2000之後,由於安全的需要,系統會對這些16位的程序加以保護,所以如果這個程序出現NULL指針,系統就會出一個錯誤提示,我不希望他這樣做,該如何操作呢?謝謝大家了
o大耳鼠o 2008-01-14
  • 打赏
  • 举报
回复
謝謝ltc_mouse的指點,已經可以了,還有一個問題,就是雖然我用了%x顯示,但是遇到00~0F的狀況
程序會自動去掉頭一個0,請問,怎樣才可以讓它顯示出00~0F
PS:請問,我怎樣才能評分呢?真是很感謝ltc_mouse 的說
ltc_mouse 2008-01-14
  • 打赏
  • 举报
回复
你的循环有问题,每17个字符将丢弃一个字符~ 应该把else去掉

其实,如果一次读16个字符作为一行,可以试试:

unsigned char buffer[16];
int left=filesize;
fseek(fp,0,0);
for( ; left>=16; left-=16){
fread(buffer,16,1,fp);
for(i=0;i<16;++i) printf("%x ",buffer[i]);
printf("\n");
}
if(left){
fread(buffer,left,1,fp);
for(i=0;i<left;++i) printf("%x ",buffer[i]);
printf("\n");
}

o大耳鼠o 2008-01-14
  • 打赏
  • 举报
回复
謝謝4樓的朋友,用你的方法,讀取膽個字符已經沒有問題了,但是循環讀取的時候,還是會出錯,代碼如下

fseek(fp, 0, 2);
filesize = ftell(fp);
printf("target file's size: %d byte\n\n", filesize);
for (int s = 0; s < filesize; s++) {
if (i == 16) {
printf("\n");
i = 0;
} else {
fseek(fp, s, 0);
fread(&content, 1, 1, fp);
printf("%x ", content);
i++;
}
}

我的目標文件是348個字節,可是只顯示出328個字節,這是爲何呢?
ltc_mouse 2008-01-14
  • 打赏
  • 举报
回复
content = fgetc(fp);
==========================
这个只能读字符。二进制读写通常用fread,fwrite,将数据读到buffer中,然后再处理
unsigned char content;
fread(&content,1,1,fp); printf("content=%x\n",content);
o大耳鼠o 2008-01-14
  • 打赏
  • 举报
回复
謝謝2位朋友的幫助,但是現在問題又來了:

#include <stdio.h>

void main(int argc, char *argv[]) {
FILE *fp;
char content;
int offset;
int i=0;
if (argc == 1 || argc > 4) {
printf("Usage:\n");
printf("tool-path target-path :display length & content of the target file\n");
printf("tool-path target-path offset :display content of the target file at the offset\n");
printf("tool-path target-path offset hex_data :write the hex_data into the offset of the target file");
} else if (argc >=2 && argc <=4) {
fp = fopen(argv[1], "rb+");
if (fp != NULL) {
if (argc == 2) {
fseek(fp, 0, 2);
offset = ftell(fp);
printf("target file's size: %d byte\n\n", offset);
rewind(fp);
content = fgetc(fp);
while (content != EOF) {
if (i == 16) {
printf("\n");
i = 0;
} else {
printf("%x ", content);
content = fgetc(fp);
i++;
}
}

} else if (argc == 3) {
sscanf(argv[2], "%d", &offset);
fseek(fp, offset, 0);
content = fgetc(fp);
printf("offset=%x,content=%x\n",offset, content);
} else if (argc == 4) {

}
} else {
printf("can't open the target file %s", argv[1]);
}
fclose(fp);
}
}

雖然可以實現,但是有一個很大的問題,就是儅讀取的數據超過0x7F時,就會出錯,我想是因爲char的範圍是0~7F,現在想請教一下,怎樣才可以實現超過7F數據的讀取
Treazy 2008-01-13
  • 打赏
  • 举报
回复
楼上说的正确!
ltc_mouse 2008-01-13
  • 打赏
  • 举报
回复
fseek(fp, (long)argv[2], 0);
==================================
main的参数argv[i]都是字符串,不会自动转化为数字的,需要使用<stdlib.h>中的atol等转换函数
fseek(fp, atol(argv[2]), 0);

65,187

社区成员

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

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