这两天准备把 备份 恢复MBR,DBR,CMOS,FAT等功能写成一个程序,
这样方便很多,其它功能都做好了,就剩 读写FAT, 始终不成功
原因是,可能对DOS来说有点大了(要几 M的)
试了很多方法都不行。。。
不知道哪位知道的, 说一下方法,最好 贴出 源码。。
下面是我代码:
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <iostream.h>
#include <fstream.h>
void main()
{
FILE *f;
unsigned char *fat=new unsigned char[2245120];;
biosdisk(2,0x81,1,0,39,4385,fat);
if((f=fopen("c:\\int86.fat","wb+"))==NULL)
{
printf("Error File\n");
return;
}
fwrite(fat,512,4385,f); //这里 改成 (fat,4385*512,1,f) 就死机 !
fclose(f);
}
用先建一个空文件再用循环追加(改变源缓冲指针)的方式,读入的数据好像有问题
用fputc()一个一个的处理,也不行
不知道那里出了问题。。
下面用 C++也不行:(只写了很少的字节)
ofstream fi("c:\\int86.fat",ios::out);
fi << fat;
有缘相识! 我中文系的
半个月拿下基本C
一个月拿下基本C++
两个月拿下基本VC
一星期拿下一半基本JAVA
五天写DOS游戏
两个月写DOS游戏系统
年后一个月拿下VFP
过一下 ACCESS, SQL SERVER
与大家一起加油啊! 很喜欢这句
"拿下!"
http://mykool.go2.icpcn.com
----------------解决方案--------------------------------------------------------
首先我想问一下,biosdisk这里调用能确定没有问题吗?fat我不懂,或者至少能说一下原理吗?
----------------解决方案--------------------------------------------------------
我觉得你这里new的数组太大了点吧?
----------------解决方案--------------------------------------------------------
#include <stdio.h>
#include <dos.h>
#include <bios.h>
#include <mem.h>
#define MAXBUF 1024
#define SECNUM 4385
#define ORGSEC 39
typedef unsigned char byte;
int main() {
FILE *ofstream;
// buffer
byte buffer[1024];
unsigned int cur_sect = ORGSEC;
unsigned int nsize = 0;
ofstream = fopen("C:\\int86.fat","wb");
if(!ofstream) {
printf("Cannot open file!\n");
return 1;
}
while(cur_sect - ORGSEC < SECNUM) {
if(cur_sect - ORGSEC + MAXBUF < SECNUM) {
biosdisk(2,0x81,1,0,cur_sect,MAXBUF,buffer);
cur_sect += MAXBUF;
nsize = MAXBUF;
}
else {
biosdisk(2,0x81,1,0,cur_sect,SECNUM - (cur_sect - ORGSEC),buffer);
cur_sect = ORGSEC + SECNUM;
nsize = SECNUM - (cur_sect - ORGSEC);
}
fwrite(buffer,sizeof(byte),nsize,ofstream);
memset(buffer,'\0',MAXBUF);
}
fclose(ofstream);
printf("Back-up completed!\n");
return 0;
}
我似乎明白你的意思了,我帮你重新写了一份,不知道是不是你要的结果,可能明天晚上给你解释,我明天一早有点事情,今天早睡了,不好意思。
[此贴子已经被作者于2006-6-25 23:01:25编辑过]
----------------解决方案--------------------------------------------------------
多谢关注啊!
没太明白你的代码。
我是要把第二硬盘的C盘的DBR后的第39扇区开始读4385个扇区(就是我的FAT)到文件
主要有几个问题,想请教一下:
一,biosdisk是怎么运转的?
TC3的帮助说:(2,0x81,1,0,cur_sect,MAXBUF,buffer) 的1,0,cur_sect指定了要处理的起始的扇区位置
MAXBUF是要处理的扇区的个数。 这里的个数有限制吗?(好像是INT型,就是说最大可处理65535个扇区啊
我的4385是在范围内啊。。为什么要弄个1024呢,是不是后面的FWRITE()有限制?)
二,FWRITE()的参数是不是有限制?
----------------解决方案--------------------------------------------------------
fwrite()
块输出:
size_t fwrite(const void *buffer,size_t size,size_t count,FILE *fptr);
将数据以指定的块数目count及指定的块大小size写入至指定的文件缓冲区中,返回值为成功写入数据的个数!
以上是书上的说明,1024大概就是size的大小吧~
不知对LZ是否有帮助。其他的我还嫩,不明白咧~!
----------------解决方案--------------------------------------------------------
抱歉,昨天给出的代码有严重的问题,下面给出最新版的代码:
#include <stdio.h>
#include <bios.h>
#include <mem.h>
#include <assert.h>
#define ORGSEC 39
#define NUMSEC 4385
#define MAXBUF 512
#define HD1 0x81 /* 次要硬盘 */
typedef char byte_t; /* 定义字节类型 */
int main() {
FILE *ofstream; /* 声明输出流指针 */
static byte_t buffer[MAXBUF]; /* 缓冲,限制512字节,因为每个sector含512字节数据 */
register int i; /* 仅仅是个计数器罢了 */
assert(ofstream = fopen("C:\\int86.fat","wb")); /* 打开制定文件二进制写入,使用断言来判断该文件是否被正常打开 */
for(i = 0; i < NUMSEC; i++) { /* 遍历每一个sector */
biosdisk(_DISK_READ,HD1,1,0,i + ORGSEC,1,buffer); /* 其中i + ORGSEC是从39号sector偏移的量,将该sector数据写入buffer */
fwrite(buffer,sizeof(buffer),1,ofstream); /* 将buffer写入文件 */
/* fwrite有四个参数,第一个欲写入文件的内存指针,第二个是欲写入数据的长度,第三个是欲写入数据的个数,第四个是写入的文件指针 */
memset(buffer,0,MAXBUF); /* 清空buffer用于下一轮数据接收,这里用不用无所谓 */
}
printf("Bakup complete!\n");
fclose(ofstream); /* 完成后关闭文件 */
return 0;
}
----------------解决方案--------------------------------------------------------
引用 yuki:
“抱歉,昨天给出的代码有严重的问题,下面给出最新版的代码”
----------------------------------------------------------
一丝不苟的好人哪!
----------------解决方案--------------------------------------------------------
感谢yuki啊,挺热心的啊,
不过,试了很多次,已经弄明白了原因了。。
主要是BIOSDISK的扇区读取限制和FWRITE的字节读取限制。。
看了您的代码,没有随后调整起始磁头,柱面,扇区的物理位置,可能不行的
因为要读取的扇区只有在前面三样东西不变的情况下才有效的吧?
(况且,就算没问题,由于是以 一个扇区为单位处理的,可能效率太低了。。)
我终于解决了,不敢独享,现吧代码贴出来,供大家交流。。。
(我是主要以同一磁道内的63个扇区为单位读写的,效率比较高,测试过,感觉效率比Norton diskedit还要高,,)
************************************
下面是我的帖子的地址:
http://bbs.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=75296&page=1
----------------解决方案--------------------------------------------------------
来而不往,非礼也。
跟yuki一样,楼主
也是礼仪之邦的良民。
---------------------------------------------
希望发帖人礼貌结帖,不要“到处留情、始乱终弃”。
----------------解决方案--------------------------------------------------------