C语言从磁盘上读取数据

HopeAlwaysHere 2008-04-12 10:16:11
干Java的,突然要用C语言做一个读取磁盘磁道上数据的程序,好像很简单的样子,但是没有一点头绪。
对于C语言中的函数库根本不了解,希望哪位大虾不惜赐教,告诉我常用的函数库和一些主要的方法。
再把这个用C语言读取磁盘磁道上数据 的 算法或者说 实现程序的思想 阐述一下~多谢多谢。
...全文
548 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mLee79 2008-04-17
  • 打赏
  • 举报
回复
磁盘也就个文件, 用你稀饭的文件操作的东东( fopen , open , CreateFile , fstream ... )打开, 定位到相应的磁道, 读写就是.

比如:
fp = fopen( "\\\\.\\PhysicsDriver0" , "rb" );
ifstream ifs( "/dev/sda" , ios::binary );
HopeAlwaysHere 2008-04-17
  • 打赏
  • 举报
回复
absread不行么?
int absread(int drive, int nsects, int sectno, void *buffer);
moomee 2008-04-12
  • 打赏
  • 举报
回复
NT下汇编的中断不是都屏蔽了么?
用NT修改的我觉得可能不稳定,但我也解决不了这个问题目。
ttlyfast 2008-04-12
  • 打赏
  • 举报
回复

.............
;以下读每一个扇区,
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 ; 段地址
.....................
HopeAlwaysHere 2008-04-12
  • 打赏
  • 举报
回复
无法实现是指哪个部分?
C语言中获取磁盘表是否是简单的从已经存在的文件中读取?而不是从磁盘的0柱0面1扇区开始依字节读取?
C语言不能直接操纵硬盘数据么?必须通过XP函数库?
hoya5121 2008-04-12
  • 打赏
  • 举报
回复
这个winXP里是无法实现的
bacy001 2008-04-12
  • 打赏
  • 举报
回复
按照我浅薄的C语言知识,要实现楼主的需求必须使用C+ASM混和编程,标准C函数库是没有直接读取硬盘磁道的函数的。
帅得不敢出门 2008-04-12
  • 打赏
  • 举报
回复
这个感觉好底层啊
  • 打赏
  • 举报
回复
这么高深?我解决不了,呵呵!不过,我可以告诉楼主一个方法,查看地址的,用%p可以查看地址.
希望这个可以对楼主有所帮助.
HopeAlwaysHere 2008-04-12
  • 打赏
  • 举报
回复
说白了就是用C编写一个 程序,先从硬盘的0柱0面1扇区读取分区表,然后根据分区表读取某个区的文件

我学过C语言,不深,一直用面向对象的语言编程。所以对C语言的函数库还有面向过程的算法不熟悉
  • 打赏
  • 举报
回复
楼主的意思是想从具体的磁道上读取数据.
  • 打赏
  • 举报
回复
哈哈!沙发!板凳!
  • 打赏
  • 举报
回复
http://download.csdn.net/source/197733
有一个下载地址,好象才1分,我没下载过,但是看大家的评论好象很不错,楼主进去看看吧!
lxhdj2008 2008-04-12
  • 打赏
  • 举报
回复
磁道?
你学过C语言吗?
是不是读写硬盘上的文件呀?
卡米尔 2008-04-12
  • 打赏
  • 举报
回复
期待高手出现!
ONLYBLUEMOON 2008-04-12
  • 打赏
  • 举报
回复
TC中调用中断可以。int86()这个函数。
就呆在云上 2008-04-12
  • 打赏
  • 举报
回复
直接读取磁道里面的数据,应该涉及到底层的驱动了吧
如果涉及驱动就要等windows开源了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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