| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2343 人关注过本帖
标题:读写大文件失败!怎么解决呢?(dos)
只看楼主 加入收藏
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
 问题点数:0 回复次数:12 
读写大文件失败!怎么解决呢?(dos)
读写大文件失败!怎么解决呢?

这两天准备把 备份 恢复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
搜索更多相关主题的帖子: dos include 文件 失败 FAT 
2006-06-25 20:42
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

首先我想问一下,biosdisk这里调用能确定没有问题吗?fat我不懂,或者至少能说一下原理吗?


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-25 22:29
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
我觉得你这里new的数组太大了点吧?

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-25 22:31
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

#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编辑过]


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-25 22:53
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
多谢关注啊!
没太明白你的代码。
我是要把第二硬盘的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()的参数是不是有限制?

有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-06-26 10:32
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏
得分:0 

fwrite()
块输出:
size_t fwrite(const void *buffer,size_t size,size_t count,FILE *fptr);
将数据以指定的块数目count及指定的块大小size写入至指定的文件缓冲区中,返回值为成功写入数据的个数!

以上是书上的说明,1024大概就是size的大小吧~
不知对LZ是否有帮助。其他的我还嫩,不明白咧~!


人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2006-06-26 10:44
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

抱歉,昨天给出的代码有严重的问题,下面给出最新版的代码:
#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;
}


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2006-06-26 22:49
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

引用 yuki:
“抱歉,昨天给出的代码有严重的问题,下面给出最新版的代码”
----------------------------------------------------------
一丝不苟的好人哪!


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-27 04:13
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 

感谢yuki啊,挺热心的啊,
不过,试了很多次,已经弄明白了原因了。。
主要是BIOSDISK的扇区读取限制和FWRITE的字节读取限制。。

看了您的代码,没有随后调整起始磁头,柱面,扇区的物理位置,可能不行的
因为要读取的扇区只有在前面三样东西不变的情况下才有效的吧?

(况且,就算没问题,由于是以 一个扇区为单位处理的,可能效率太低了。。)

我终于解决了,不敢独享,现吧代码贴出来,供大家交流。。。
(我是主要以同一磁道内的63个扇区为单位读写的,效率比较高,测试过,感觉效率比Norton diskedit还要高,,)

************************************

下面是我的帖子的地址:
http://bbs.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=75296&page=1


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-06-28 01:33
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
来而不往,非礼也。
跟yuki一样,楼主
也是礼仪之邦的良民。
---------------------------------------------
希望发帖人礼貌结帖,不要“到处留情、始乱终弃”。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-28 05:19
快速回复:读写大文件失败!怎么解决呢?(dos)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017289 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved