首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

考下大家的基本功,欢迎高手抢分,该如何处理

2012-03-05 
考下大家的基本功,欢迎高手抢分快速的写一个2G的文件要求,这个文件在物理磁盘上是连续的提醒直接seek到文

考下大家的基本功,欢迎高手抢分
快速的写一个2G的文件
要求,这个文件在物理磁盘上是连续的

提醒直接seek到文件结尾结尾肯定是不行的

另:有没有简单点方法可以看到磁盘上的某个文件是否是连续的

[解决办法]
这个不是C++库可以解决的,应该看看操作系统的API
[解决办法]
可以考虑使用内存映射文件。
[解决办法]
biosdisk()调用BIOS磁盘驱动程序函数
原形:char biosdisk(int cmd,int drive,int head,int track,int sector,int nsects,void *buffer)
功能:使用中断0x13,直接调用BIOS进行磁盘操作
参数:(1)cmd:
    2-数据以每扇区512字节的格式读入buffer,起始扇区由head、track和sector定,扇区数由nsects定。
    3-将buffer中的数据按每扇区512字节写入磁盘。
    4-对扇区进行数据校验。
    6-格式化一个磁盘并对化扇区设置化标志。
    8-返回当前驱动器参数在buffer的前4个字节中。
    10-长读,每扇区读入512字节加上额外的4个字节。
    11-长写,每扇区写入512字节加上额外的4个字节。
   (2)drive:0-第一个软驱;1-第二个软驱;0x80-第一个硬驱
   (3)head:磁头
   (4)track:磁道
   (5)sector:扇区
   (6)nsects:扇区数
   (7)buffer:数据缓冲区,定义为unsigned char buffer[];
返回值:0x00-操作成功
    0x01-错误命令
    0x03-企图写具有写保护的磁盘
    0x07-驱动器参数设置错误
    0x10-磁盘读/CRC/ECC错误
头文件:bios.h
注:对于硬盘主引导记录扇区head=0,track=0,sector=1

你用这个函数试试有没有用,上面的是我复制别人的,如果没有用的话,只好嵌入汇编用扩展int13h写硬盘,

第一章 扩展 Int13H 技术资料

一. 简介
设计扩展 Int13H 接口的目的是为了扩展 BIOS 的功能, 使其支持
多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能.

二. 数据结构

1. 数据类型约定
BYTE 1 字节整型 ( 8 位 )
WORD 2 字节整型 ( 16 位 )
DWORD 4 字节整型 ( 32 位 )
QWORD 8 字节整型 ( 64 位 )

2. 磁盘地址数据包 Disk Address Packet (DAP)
DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾
越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
DAP 的结构如下:

struct DiskAddressPacket
{
BYTE PacketSize; // 数据包尺寸:
//(固定值,恒等于16,即10H,指本结构所占用的存储空间)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segment:offset)
QWORD BlockNum; // 磁盘起始绝对块地址
};

PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在
目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于
16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ).
BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说
是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块.
BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据
缓冲区必须位于常规内存以内(1M).
BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位),
与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关系
是:
BlockNum =
(cylinder * NumberOfHeads + head) * SectorsPerTrack + sector - 1;

其中 cylinder, head, sector 是 CHS 地址, NumberOfHeads 是磁盘
的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数.
也就是说 BlockNum 是沿着 扇区-> 磁道-> 柱面 的顺序记数的. 这一顺
序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同
(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).

3. 驱动器参数数据包 Drive Parameters Packet
驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中
使用的数据包. 格式如下:
struct DriveParametersPacket
{
WORD InfoSize; // 数据包尺寸:
//(固定值,等于26,即1AH,指本结构所占用的存储空间)
WORD Flags; // 信息标志
DWORD Cylinders; // 磁盘柱面数
DWORD Heads; // 磁盘磁头数
DWORD SectorsPerTrack; // 每磁道扇区数
QWORD Sectors; // 磁盘总扇区数
WORD SectorSize; // 扇区尺寸 (以字节为单位)
};
信息标志用于返回磁盘的附加信息, 每一位的定义如下:

0 位:
0 = 可能发生 DMA 边界错误
1 = DMA 边界错误将被透明处理
如果这位置 1, 表示 BIOS 将自动处理 DMA 边界错误, 也就是说
错误代码 09H 永远也不会出现.

1 位:
0 = 未提供 CHS 信息
1 = CHS 信息合法


如果块设备的传统 CHS 几何信息不适当的话, 该位将置 0.

2 位:
0 = 驱动器不可移动
1 = 驱动器可移动

3 位: 表示该驱动器是否支持写入时校验.

4 位:
0 = 驱动器不具备介质更换检测线
1 = 驱动器具备介质更换检测线


5 位:
0 = 驱动器不可锁定
1 = 驱动器可以锁定
要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1
(某些驱动器号为 0 到 0x7F 的设备也需要置位)

6 位:
0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果
驱动器中有存储介质, CHS 值将被返回.
1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).

7 - 15 位: 保留, 必须置 0.


[解决办法]
使用内存影射文件

热点排行