C语言从磁盘上读取数据解决办法
C语言从磁盘上读取数据
干Java的,突然要用C语言做一个读取磁盘磁道上数据的程序,好像很简单的样子,但是没有一点头绪。
对于C语言中的函数库根本不了解,希望哪位大虾不惜赐教,告诉我常用的函数库和一些主要的方法。
再把这个用C语言读取磁盘磁道上数据 的 算法或者说 实现程序的思想 阐述一下~多谢多谢。
------解决方案--------------------
干Java的,突然要用C语言做一个读取磁盘磁道上数据的程序,好像很简单的样子,但是没有一点头绪。
对于C语言中的函数库根本不了解,希望哪位大虾不惜赐教,告诉我常用的函数库和一些主要的方法。
再把这个用C语言读取磁盘磁道上数据 的 算法或者说 实现程序的思想 阐述一下~多谢多谢。
------解决方案--------------------
- Assembly code
............. ;以下读每一个扇区, StartRead: mov ax, [SectAdr] mov es, ax ; es:bx,段地址 mov bx, [MemAdr] ; es:bx,偏移地址 mov dl, 0h ; 驱动器号 mov dh, [BeginSide] ; 读写头号 mov ch, [BeginTrack] ; 磁道号 mov cl, [BeginField] ; 扇区号 ReadField: mov ah, 02h ; 读磁盘 mov al, 01h ; 一个扇区 int 13h ; 磁盘服务中断 jc ReadField ; 不成功重新读 ;读一个扇区后应该做以下调整 inc byte [BeginField] ; 调整扇区号 cmp byte [BeginField], 013h ; 每个磁道的一侧包括18个扇区,读完后要调整磁道号和磁头号 jne next0 ; 否则跃过磁道号与磁头号调整跳转到next0,只调整内存地址和扇区计数 mov byte [BeginField], 01h ; 重新置扇区号,从1号开始到18号结束,而不是从0号开始 cmp byte [BeginSide], 00h ; 查看磁头号,看是否需要增加磁道号 je next1 ; 不需要则直接跳转到调整磁头号 inc byte [BeginTrack] ; 调整磁道号 next1: xor byte [BeginSide], 0x01 ; 调整磁头号 next0: mov bx, [MemAdr] add bx, 0x0200 ; 每读入一个扇区地址增加512个字节 mov [MemAdr], bx ; 调整内存地址 inc byte [Num] ; 调整读入扇区数 cmp byte [Num], 0x80 ; 检查是否读入128个扇区,即64k数据 jne next2 ; 如果不到64k,则跳转到next2,继续下一次读扇区操作 inc byte [Sect] ; 如果达到64k,则增加读入段数计数值 ;即时显示,读完一个64k段在新的一行显示一个“Sect” mov ax, cs mov es, ax mov ax, DoneSect mov bp, ax ; ES: BP = ... mov cx, 6 ; CX = ... mov ax, 01301h ; AH = 13, AL = 01h mov bx, 000ch ; ...0(BH=0)....(BL=0Ch,..) mov dh, byte [Sect]; 第Sect,即新增加的行 mov dl, 0 ; 第0列 int 10h ; 10h ... mov byte [Num], 0h mov bx, 0h mov [MemAdr], bx mov ax, [SectAdr] ; 调整段地址 add ax, 0x1000 mov [SectAdr], ax cmp byte [Sect], 01h ; 如果读入1段则停止读入 je next3 next2: jc StartRead BeginTrack: db 0x0 ; 开始磁道号 BeginSide: db 0x0 ; 开始磁头号 BeginField: db 0x2 ; 开始扇区号 Num: db 0x0 ; 读入扇区数 Sect: db 0x0 ; 读入段数 MemAdr: dw 0x0000 ; 偏移地址 SectAdr: dw 0x7000 ; 段地址 .....................
------解决方案--------------------
直接读取磁道里面的数据,应该涉及到底层的驱动了吧
如果涉及驱动就要等windows开源了
------解决方案--------------------
磁盘也就个文件, 用你稀饭的文件操作的东东( fopen , open , CreateFile , fstream ... )打开, 定位到相应的磁道, 读写就是.
比如:
fp = fopen( "\\\\.\\PhysicsDriver0" , "rb" );
ifstream ifs( "/dev/sda" , ios::binary );