[分享] 读扇区数据C语言程序

[复制链接]
  • TA的每日心情
    难过
    2013-2-15 09:50
  • 签到天数: 1 天

    [LV.1]布衣百姓

    4

    主题

    51

    回帖

    1031

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1031
    QQ
    发表于 2009-11-29 11:48:28 | 显示全部楼层 |阅读模式
    //********************************************
    //文件名:CRSE.C
    //功能:1. 读硬盘0面0头1扇区数据并建立存储文件
    //      2. 将数据用16进制显示在屏幕上
    //********************************************
    #include<stdio.h>                            //1.
    #include<bios.h>                             //2.
    void main()                                  //3.
    {                                            //4.
       FILE *fp;                                 //5.
       char h[512];                              //6.存放扇区数据
       char sh[13];                              //7.存放文件名
       int i,j;                                  //8.
       int cyl=0,head=0,sector=1;                //9.柱面,磁头,扇区编号
       printf("Enter file name: ");              //10.
       scanf("%s",sh);                           //11.输入文件名
       fp=fopen(sh,"wb+");                       //12.打开文件
       biosdisk(0x02,0x80,head,cyl,sector,1,h);  //13.调用函数将扇区数据读入数组
       for(i=0;i<=511;i++)                       //14.将数据输出到文件
         fputc(h[i],fp);                         //15.
       rewind(fp);                               //16.文件指针回到开头
       for(i=1;i<=512;i++)                       //17.
       {                                         //18.
         j=fgetc(fp);                            //19.取字符
         printf("%2x",j);                        //20.按16进制显示
         if(i%32==0)                             //21.每显示32字节换行
           printf("\n");                         //22.
       }                                         //23.
       fclose(fp);                               //24.关闭文件
       printf("\n");                             //25.
    }                                            //26.
    C源程序解释

      C语言源程序的解释相对于汇编语言源程序要简单一些,这是因为C语言属于高级编程语言,它更接近于人类的自然语言。因此在C源程序中对于那些含义非常明确的语句,就不进行解释了。
    第2行将头文件bios.h包含进来。函数biosdisk()的原型是在头文件bios.h里定义的,所以在程序中调用函数biosdisk(),必须用#include<bios.h>语句将头文件包含进来。
    第12行用"wb+"的方式打开文件,文件名存放在数组sh里。"wb+"方式指定文件以二进制方式打开;既可以读出数据,也可以写入数据;运行程序时若文件已存在,则文件的内容被破坏;若文件不存在,则建立文件。
    因此本程序在运行前,操作者一定要看一下在当前目录下是否有同名文件,如盲目操作,可能产生破坏性的严重后果。
    如果想让程序运行时更加安全,必须在源程序里增加一部分检测语句。这里给出一个检测方法,大家可作为参考。
    在第11行和第12行中间增加下列内容:
    if((fp=fopen(sh,"rb"))!=NULL)
         {
           do
           {
           printf("File already exists.Continue(Y/N)?:");
             c=toupper(getche());
           printf("\n");
           }
           while((!(c=='N'))&&(!(c=='Y')));
           if(c=='N')
             exit(0);
         }
    这一段语句的作用是按照键盘输入的文件名,以只读方式打开文件,因为只读方式不破坏原文件。如果打开文件失败,说明没有同名文件,可继续进行。如果打开文件成功,说明有同名文件。
    这时程序在屏幕上输出一行提示“File already exists.Continue(Y/N)?:”,意思是文件已经存在,是否继续进行?如果回答N,则退出程序返回操作系统;如果回答Y,则继续执行程序,原来存在的文件内容就被破坏了。如果回答N和Y以外的字符,则程序循环提示。
    增加的语句里面多了一个字符变量c,需在定义变量的时候加一条语句“char c;”;多调用了三个函数,需在开头增加头文件包含语句:
    #include<stdlib.h>
    #include<conio.h>
    #include<ctype.h>
    第13行调用函数biosdisk()读取扇区数据。
    第14-15行用一个循环将512个字符输出到文件。循环结束以后,文件指针指在文件的末尾。这时如果再对文件进行操作,则必需将指针返回。
    第16行调用函数rewind()将文件指针返回到开头。
    第17-24行将存入文件的扇区数据按16进制方式打印到屏幕。

                               程序运行


    运行程序时在命令行输入CRSE,然后回车。屏幕上出现输入文件名的提示,输入文件名后回车,执行程序。
    输入文件名时,一定要观察一下当前目录中是否有同名文件,以防止同名文件被破坏。在确保没有同名文件时,再敲回车键。
    程序执行的结果,在当前目录下建立一个512字节的扇区数据文件,同时将每一个字节用16进制数据格式打印到屏幕上,显示结果如下:
    F:\>crse
    Enter file name: se001
    33c08ed0bc 07cfb50 7501ffcbe1b7cbf1b 65057b9e5 1f3a4cbbebe 7b1 4
    382c7c 9751583c610e2f5cd188b148bee83c610497416382c74f6be10 74eac
    3c 074fabb 7 0b4 ecd10ebf2894625968a46 4b4 63c e7411b4 b3c c74 5
    3ac4752b40c64625 67524bbaa5550b441cd1358721681fb55aa7510f6c1 174
    b8ae0885624c7 6a1 6eb1e8866 4bf a 0b8 1 28bdc33c983ff 57f 38b4e
    25 34e 2cd137229be59 7813efe7d55aa745a83ef 57fda85f67583be2e 7eb
    8a98915299 346 81356 ae812 05aebd54f74e433c0cd13ebb8 0 080314219
    5633f656565250 65351be10 0568bf45052b8 0428a5624cd135a588d641072
    a4075 14280c7 2e2f7f85ec3eb74b7d6c7f8b1edceded0a7a1a3b0b2d7b0b3
    ccd0f2cedeb7a8bcccd0f8a1a3 0bcd3d4d8b2d9d7f7cfb5cdb3cab1b3f6cfd6
    b4edcef3a1a3b0b2d7b0b3ccd0f2cedeb7a8bcccd0f8a1a3 0c8b1c9d9b2d9d7
    f7cfb5cdb3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 08bfc1e578bf5cb 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 039253a25 0 080 1
    1 0 6fe7f 43f 0 0 086fa3f 0 0 041 5 ffefffec5fa3f 0a07fde 1 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 055aa
  • TA的每日心情
    开心
    2013-2-15 10:49
  • 签到天数: 1 天

    [LV.1]布衣百姓

    0

    主题

    274

    回帖

    190

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    190
    QQ
    发表于 2009-11-29 19:44:50 | 显示全部楼层
    原来读扇区的是BIOSDISK()函数,谢楼主
  • TA的每日心情
    开心
    2024-5-4 12:56
  • 签到天数: 3581 天

    [LV.Master]三朝元老

    35

    主题

    6006

    回帖

    2万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    21048
    发表于 2012-4-14 01:03:45 | 显示全部楼层
    我大学学过C++编程,后来又培训了数据恢复硬盘维修,真想做出点成绩。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-5-10 13:53
  • 签到天数: 3 天

    [LV.2]九品芝麻官

    1

    主题

    123

    回帖

    115

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    115
    发表于 2012-4-14 08:20:48 | 显示全部楼层
    真后悔当时没继续学习C语言,谢谢了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-6 12:40
  • 签到天数: 211 天

    [LV.7]四品道员

    4

    主题

    250

    回帖

    1052

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1052
    发表于 2012-5-6 09:43:26 | 显示全部楼层
    我在VC里键入以上程序,不行呐。我已经把BIOS.H库文件调入相应文件夹了,还是不行。why?[s:206]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    14

    回帖

    48

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    48
    发表于 2012-6-28 00:08:37 | 显示全部楼层
    这段代码……说真的,太笨了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    14

    回帖

    48

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    48
    发表于 2012-6-28 00:09:19 | 显示全部楼层
    00001001 发表于 2012-5-6 09:43
    我在VC里键入以上程序,不行呐。我已经把BIOS.H库文件调入相应文件夹了,还是不行。why?

    现在的系统已经没有BIOS.H啦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-26 11:45
  • 签到天数: 40 天

    [LV.5]六品通判

    1

    主题

    100

    回帖

    75

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    75
    发表于 2012-10-4 14:38:32 | 显示全部楼层
    程序代码这一块一直是我的一个心思

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-4 12:56
  • 签到天数: 3581 天

    [LV.Master]三朝元老

    35

    主题

    6006

    回帖

    2万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    21048
    发表于 2012-11-16 00:45:49 | 显示全部楼层
    学习学习啊。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表