版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、文件系統(tǒng) 實(shí)驗(yàn)報(bào)告一、 實(shí)驗(yàn)?zāi)康牧私獠僮飨到y(tǒng)中文件系統(tǒng)的原理以及實(shí)現(xiàn)方法。二、 實(shí)驗(yàn)方法通過FAT12文件系統(tǒng)的解讀,了解文件系統(tǒng)的原理和實(shí)現(xiàn)。三、 實(shí)驗(yàn)任務(wù)通過對(duì)FAT12文件系統(tǒng)的了解,編寫程序,讀取并列出一個(gè)虛擬軟盤中文件信息(文件名、屬性、修改時(shí)間等),以及讀取其中的文件內(nèi)容四、 實(shí)驗(yàn)要點(diǎn)FAT12文件系統(tǒng)的了解,Linux系統(tǒng)下文件讀寫相關(guān)系統(tǒng)調(diào)用。五、 實(shí)驗(yàn)過程1. FAT12 文件系統(tǒng)分析簇是操作系統(tǒng)分配文件空間的基本單位,簇由若干個(gè)扇區(qū)組成。在FAT12文件系統(tǒng)中,簇號(hào)的有效位是12位,所以這種文件系統(tǒng)就被稱為FAT12。FAT12文件系統(tǒng)中大致可以分成五個(gè)區(qū),這五個(gè)區(qū)為:起始
2、扇區(qū)占用扇區(qū)起始地址結(jié)束地址分區(qū)010x000000000x000001FF引導(dǎo)區(qū)190x000002000x000013FFFAT區(qū)1090x000014000x000025FFFAT備份區(qū)19120x000026000x00003DFF根目錄區(qū)31-0x00003E00-文件數(shù)據(jù)區(qū)其中,引導(dǎo)區(qū)中儲(chǔ)存著一些基本的信息。例如,0x0000000B和0x0000000C兩個(gè)字節(jié)保存著每個(gè)扇區(qū)的大小,0x0000000D保存著每個(gè)簇占用多少個(gè)扇區(qū)。FAT區(qū)中儲(chǔ)存著簇號(hào)。在0x00000200開始的三個(gè)字節(jié),分別儲(chǔ)存設(shè)備類型標(biāo)記(0xF0為軟盤);第二個(gè)第三個(gè)字節(jié)均為0xFF,是FAT標(biāo)識(shí)符。在FA
3、T12文件系統(tǒng)中,每個(gè)簇占用12位,即1.5個(gè)字節(jié)。簇號(hào)與地址的對(duì)應(yīng)關(guān)系如下表:地址偏移000001002003004005簇序號(hào)000001002003一個(gè)簇號(hào)跨越兩個(gè)字節(jié),每次讀取簇號(hào)時(shí)讀取兩個(gè)字節(jié),然后對(duì)讀出的兩個(gè)字節(jié)進(jìn)行位運(yùn)算處理,得到下一簇的簇序號(hào)。注意,這里同樣需要對(duì)高低位進(jìn)行處理,即使用位計(jì)算的方式提取相應(yīng)的簇號(hào)信息。根據(jù)上述的原理,可以得出一個(gè)函數(shù),以一個(gè)簇號(hào)為參數(shù),返回值為文件下一個(gè)簇號(hào)。代碼如下:int getNextClutserId(FILE *fp, short clusterId)unsigned short tmp, low = 0, high = 0;int a
4、ddress = (clusterId * 3 / 2) + 0x0000200;fseek(fp, address, SEEK_SET);fread(void *)(&tmp), 1, sizeof(unsigned short), fp);low = (tmp & 0xFFF0) 4);high = tmp & 0x0FFF;return (clusterId % 2 = 0 ? high : low);其中,fp 是用于讀取文件系統(tǒng)的文件流,clusterID是當(dāng)前簇號(hào),返回值是下一個(gè)簇號(hào)。函數(shù)體的第二句代碼,計(jì)算出當(dāng)前簇號(hào)對(duì)應(yīng)的地址,用于文件指針的定位。第三句代碼是根據(jù)第二句計(jì)算得到的
5、地址對(duì)文件指針進(jìn)行定位,定位到當(dāng)前簇號(hào)所對(duì)應(yīng)的信息處。第四句代碼是從文件指針的位置為起始位置讀入兩個(gè)字節(jié)的內(nèi)容(fread會(huì)自動(dòng)對(duì)高低字節(jié)位進(jìn)行處理)。并把這兩個(gè)字節(jié)的信息儲(chǔ)存到tmp變量之中。例如,讀取002簇號(hào)的下一個(gè)簇號(hào),根據(jù)公式,計(jì)算得到的address是0x00000203,讀取到0x00000203和0x00000204兩個(gè)字節(jié)的內(nèi)容。我們需要的是0x00000203整個(gè)字節(jié)的內(nèi)容和0x00000204的高四位,所以需要跟0xFFF0進(jìn)行位與運(yùn)算,并向右移四位,得到下一個(gè)簇號(hào)。同樣地,讀取003簇號(hào)的下一個(gè)簇號(hào),根據(jù)公式,計(jì)算得到的address是0x00000204,讀取到0x0
6、0000204和0x00000205兩個(gè)字節(jié)的內(nèi)容,我們需要的是0x00000205整個(gè)字節(jié)的內(nèi)容和0x00000204第四位的內(nèi)容,所以需要跟0x0FFF進(jìn)行位與運(yùn)算,得到下一個(gè)簇號(hào)。所以代碼中需要對(duì)簇號(hào)的奇偶性進(jìn)行判斷,跟根據(jù)奇偶性的不同返回不同的值。在根目錄中,保存著根目錄下面的文件或文件夾的信息。每個(gè)文件或者文件夾的信息使用32個(gè)字節(jié)保存。這些內(nèi)容的含義如下表:地址0123456789ABCDEF內(nèi)容文件名擴(kuò)展名屬性保留位地址0123456789ABCDEF內(nèi)容保留位時(shí)間日期首簇號(hào)文件大小這里可以看出點(diǎn)問題,F(xiàn)AT中采用4個(gè)字節(jié)保存文件的大小,也就是說,文件的大小不能超過232字節(jié),也
7、就是4G;文件名和擴(kuò)展名采用了固定長(zhǎng)度,分別為8和3,太長(zhǎng)的文件名在FAT中是不允許的。其中,文件名的第一個(gè)字節(jié)還有其他的意義,例如,當(dāng)文件名的第一個(gè)字節(jié)為0x00時(shí),表示這一項(xiàng)沒有文件;為0xE5時(shí),則表示這個(gè)文件已經(jīng)被刪除,在編碼時(shí)應(yīng)該忽略這個(gè)文件。文件的屬性采用一個(gè)字節(jié),也就是8個(gè)位來表示文件的6種屬性,最高兩位是保留位,沒有實(shí)際意義。這個(gè)字節(jié)的定義為:位76543210屬性保留保留歸檔目錄卷標(biāo)系統(tǒng)隱藏只讀在列出文件列表時(shí),對(duì)各個(gè)位進(jìn)行位與運(yùn)算以后,對(duì)結(jié)果進(jìn)行判斷,從而得出相應(yīng)的屬性值,根據(jù)上表,可以得出一個(gè)函數(shù),參數(shù)是表示文件屬性的那個(gè)字節(jié),返回值是一個(gè)以字符方式顯示文件屬性的一個(gè)字符
8、串char *formatAttribute(char attribute)char *result = (char *)malloc(sizeof(char)* 7);result0 = (attribute & 0x01) = 0x01) ? r : -;result1 = (attribute & 0x02) = 0x02) ? h : -;result2 = (attribute & 0x04) = 0x04) ? s : -;result3 = (attribute & 0x08) = 0x08) ? l : -;result4 = (attribute & 0x10) = 0x10
9、) ? d : -;result5 = (attribute & 0x20) = 0x20) ? f : -;result6 = 0;return result;因?yàn)槲募傩杂?種,需要6個(gè)字符分別存放六種屬性,第7位則用于儲(chǔ)存字符串的結(jié)束標(biāo)記0,確保輸出的時(shí)候不會(huì)產(chǎn)生亂碼。這個(gè)函數(shù)代碼是通過位與運(yùn)算對(duì)文件的各個(gè)屬性進(jìn)行判斷,并在相應(yīng)的字符位用字符或者-填充,最后把字符串返回。時(shí)間和日期都采用的是壓縮儲(chǔ)存,儲(chǔ)存時(shí)間兩個(gè)字節(jié)的各位含義如下:位1514131211109876543210時(shí)(0-23)分(0-59)兩秒(0-29)儲(chǔ)存日期兩個(gè)字節(jié)的各位含義如下:位15141312111098765
10、43210距離1980年的年數(shù)(0-119)月(1-12)日(1-31)注:日期和時(shí)間都需要對(duì)高低字節(jié)進(jìn)行交換然后再讀取。實(shí)驗(yàn)中使用fread方法會(huì)自動(dòng)進(jìn)行交換。根據(jù)上面的原理,可以得出這樣的一個(gè)函數(shù),這個(gè)函數(shù)以表示日期和時(shí)間的兩個(gè)原始值作為參數(shù)輸入,返回的是一個(gè)格式形如”xxxx-xx-xx xx:xx:xx”的字符串,這個(gè)函數(shù)的代碼如下:char *formatDatetime(short date, short time)int year, month, day, hour, minute, second;char *result = (char *)malloc(sizeof(char
11、)* 20);year = 1980 + (date & 0xE000) 9);month = (date & 0x01E0) 5);day = (date & 0x001F);hour = (time & 0xF800) 11);minute = (time & 0x07E0) 5);second = (time & 0x001F) size是file_content中表示文件大小的一個(gè)整型變量,用于計(jì)算文件夾中最大文件數(shù)量,newInfo是一個(gè)file_info結(jié)構(gòu)體的指針,用于儲(chǔ)存讀取到的文件信息原始值。先把一個(gè)文件信息的原始信息從文件內(nèi)容中提取出來,為此,可以實(shí)現(xiàn)內(nèi)存復(fù)制的函數(shù),代碼如
12、下:int copyTo(void *desc, void *src, int size)int counter = 0, i;for (i = 0; i filename0 != (char)0xE5 & newInfo-filename0 != (char)0x00) file_list_new_info(newInfo, &newId, &newInfoNode);if (newInfo-attributes & 0x10) = 0x10)if (newInfo-filename0 = .) continue;char *buffer = (char *)malloc(sizeof(ch
13、ar)* 9);int j;for (j = 0; j filenamej != (char)0x20; j+)bufferj = newInfo-filenamej;bufferj = 0;queue_new_task(buffer, 0, 0, newInfo-pos);這是放在一個(gè)for循環(huán)中的代碼,先通過文件名判斷這個(gè)文件是否存在,如果存在,則把文件信息添加到程序的文件信息鏈表之中。再則判斷是否是目錄,如果是目錄,則把這個(gè)目錄添加到隊(duì)列之中。2. 文件儲(chǔ)存方式FAT文件系統(tǒng)對(duì)空間的分配和管理是以簇為基本單位的。所以,一個(gè)邏輯上連續(xù)的文件可能會(huì)被分散地儲(chǔ)存在磁盤的各個(gè)位置。操作系統(tǒng)輸出文
14、件時(shí),遵循下面的步驟:1. 會(huì)先通過文件夾信息找到文件首簇號(hào)。2. 根據(jù)文件的首簇號(hào),定位到FAT區(qū)相應(yīng)位置;讀出下一個(gè)簇的簇號(hào)。3. 如果下一個(gè)簇的簇號(hào)不是結(jié)束標(biāo)記(0xFFF),則會(huì)根據(jù)讀出的下一個(gè)簇號(hào)定位,讀出簇里面的內(nèi)容。如果讀出的是結(jié)束標(biāo)記,則表示文件已經(jīng)讀取完成。假如一個(gè)文件被分散儲(chǔ)存在0x012,0x022,0x302三個(gè)簇里。從目錄的信息中讀出首簇號(hào)0x012,讀出0x012簇里的內(nèi)容;然后再通過0x012這個(gè)簇號(hào)在FAT區(qū)中找到下一個(gè)簇號(hào)0x022,讀出0x022的內(nèi)容;再通過0x022這個(gè)簇號(hào)找到下一個(gè)簇號(hào)0x302,讀出0x302中的內(nèi)容;再通過0x302讀出下一個(gè)簇號(hào)的
15、內(nèi)容,此時(shí),讀出的簇號(hào)為0xFFF,即表示這個(gè)文件已經(jīng)結(jié)束。本實(shí)驗(yàn)中,讀取文件的具體實(shí)現(xiàn)方法如下:1. 通過一個(gè)鏈表,將這個(gè)文件的所有簇號(hào)儲(chǔ)存起來。2. 遍歷儲(chǔ)存簇號(hào)的鏈表,逐個(gè)逐個(gè)簇讀取出來并儲(chǔ)存到內(nèi)存之中,返回之。下面是讀取文件的實(shí)現(xiàn)所需要的一些數(shù)據(jù)結(jié)構(gòu):struct int_linked_list int data;struct int_linked_list *next;struct file_content struct int_linked_list *curList;void *content;int size;char *filename;其中,int_linked_list是
16、一個(gè)儲(chǔ)存整型的鏈表,file_content是一個(gè)用于保存讀出文件內(nèi)容和文件信息的結(jié)構(gòu)體。遍歷鏈表的過程中,通過一個(gè)while循環(huán)實(shí)現(xiàn),把讀取到簇號(hào)添加到鏈表之中。具體實(shí)現(xiàn)代碼如下,tail為保存簇號(hào)鏈表的末尾結(jié)點(diǎn)指針,fp是用于讀取文件的文件指針,curConnt是一個(gè)用于統(tǒng)計(jì)文件簇?cái)?shù)的變量,便于后續(xù)步驟分配內(nèi)存空間使用,下文同:while (clusterId = getNextClutserId(fp, clusterId) != 0x00000FFF)curCount+;tail-next = (struct int_linked_list *)malloc(sizeof(struct
17、 int_linked_list);tail-next-data = clusterId;tail-next-next = NULL;tail = tail-next;把簇號(hào)讀取完畢以后,開始對(duì)文件內(nèi)容進(jìn)行讀取,下面是文件內(nèi)容讀取的具體實(shí)現(xiàn)代碼,下面代碼中的content是一個(gè)指向用于存放文件內(nèi)容的內(nèi)存空間的指針變量:content-size = curCount * 512;content-content = malloc(content-size);struct int_linked_list *ptr = head;int i = 0, address = 0xFFFFFFF;for (
18、ptr = head; ptr != NULL; ptr = ptr-next, i+)address = 0x00003E00 + (512 * ptr-data);fseek(fp, address, SEEK_SET);fread(void *)(char *)(content-content) + (512 * i), 512, 1, fp);在for循環(huán)的第一句代碼之中,通過簇號(hào)對(duì)簇所在的地址進(jìn)行計(jì)算,把地址值儲(chǔ)存到address變量之中;第二句代碼則是通過上一步計(jì)算得到的address變量對(duì)文件指針進(jìn)行定位,第三句是通過fread方法把文件內(nèi)容讀入到內(nèi)存之中。六、 實(shí)驗(yàn)結(jié)論1. F
19、AT12文件系統(tǒng)中,把磁盤劃分成引導(dǎo)區(qū)、FAT區(qū)、FAT備份區(qū)、根目錄區(qū)和文件數(shù)據(jù)區(qū)。2. 除了根目錄以外,文件系統(tǒng)把每個(gè)文件夾都當(dāng)成是一個(gè)特殊的文件進(jìn)行處理。3. FAT12文件系統(tǒng)通過簇進(jìn)行空間的管理和分配。七、 完整實(shí)驗(yàn)代碼/* 操作系統(tǒng)課程 實(shí)驗(yàn)* FAT12 文件系統(tǒng) 實(shí)驗(yàn)代碼* 雖然這個(gè)程序在 Windows 和 Linux 環(huán)境下都能運(yùn)行。* 不過,在 Windows 環(huán)境下運(yùn)行的話,顯示文件內(nèi)容的時(shí)候,內(nèi)容的末尾會(huì)有幾個(gè)奇怪的字符。* Linux 環(huán)境下完全沒問題* 暫時(shí)推測(cè)是 Windows 控制臺(tái)的原因,Windows 控制臺(tái)會(huì)把一些非字符的 ASCII 顯示為奇怪的字符,
20、* 例如,0x0A 會(huì)顯示成一個(gè)笑臉,Linux 的控制臺(tái)下不會(huì)對(duì)這些非字符的 ASCII 進(jìn)行處理* 我是今天早上才發(fā)現(xiàn)這個(gè)問題的阿 ()* 注意:編譯前,需要把 IMAGE_FILE 那個(gè)宏定義改成公郵上面的那個(gè) IMG 文件;* Linux 下打開這個(gè)源碼文件注釋會(huì)變成亂碼*/ 這個(gè)定義只是為了程序能在 VS2013 下面正常編譯而已#ifdef _WIN32#define _CRT_SECURE_NO_WARNINGS#endif#include #include #include #ifdef _WIN32#include #endif#define OK 0x00000000#de
21、fine MESSAGE_FILE_NOT_FOUND 0xE0000404#define ERROR_MALLOC_FAILED 0xF0000001#define ERROR_IO_ERROR 0xF0000002/ 這里改路徑 #define IMAGE_FILE /home/user/DOS622.IMG/ 這里改路徑 /* 這里是結(jié)構(gòu)體的定義 */ 這里是文件信息struct file_info char filename8;char extname3;char attributes;char reserved10;short time;short date;short pos;in
22、t size;struct file_info_node int id;struct file_info *info;struct file_info_node *next;/ 這里是儲(chǔ)存文件夾信息struct folder_info char *filename;int fileBeginIndex, fileEndIndex;struct file_info_node *beginFile, *endFile;struct folder_info *next;/ 這里是一個(gè)隊(duì)列,用于迭代方式遍歷文件系統(tǒng)的一個(gè)中間變量struct queue_info char *filename;int
23、offset, size, cluster;struct queue_info *next;/ 一個(gè)整數(shù)鏈表結(jié)構(gòu)struct int_linked_list int data;struct int_linked_list *next;/ 這里是一個(gè)文件結(jié)構(gòu),表示內(nèi)容,可以讀取文件的其中一段,也可以通過簇的方式完整讀入整個(gè)文件struct file_content struct int_linked_list *curList;void *content;int size;char *filename;/* 這里是全局變量的定義 */struct file_info_node *file_lis
24、t_head, *file_list_tail;struct folder_info *folder_info_head, *folder_info_tail;struct queue_info *queue_head, *queue_tail;char decToHex16 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F ;/* 這里是函數(shù)的定義 */int file_list_init();int file_list_new_info(struct file_info *info, int *id, struct file_info_nod
25、e *newInfoNode);int folder_info_init();int folder_info_new_info(struct folder_info *info);int queue_init();int queue_new_task(char *filename, int offset, int size, int cluster);struct queue_info *queue_get_task();int process_task(struct queue_info* info);struct file_content* readContentFromFixedSect
26、ion(FILE *fp, int offset, int size);struct file_content* readContentFromCluster(FILE *fp, short clusterId, int isFolder, int *size);struct file_content* find_file_by_id(FILE *fp, int id, int *errCode);int process_file_content(struct file_content* content, struct queue_info *info);int getNextClutserI
27、d(FILE *fp, short clusterId);int copyTo(void *desc, void *src, int size);void print_all_list();void print_file_content(struct file_content *content);char *formatIndex(int i);char *formatClustNo(int i);char *formatFileName(char *filename, char *ext);char *formatAttribute(char attribute);char *formatD
28、atetime(short date, short time);char *formatSize(int size, int rightAlign);/* 主函數(shù) */int main(int argc, char *args)struct queue_info *task = NULL;int choose, status;FILE *fp = fopen(IMAGE_FILE, r);struct file_content *content;char tmp;if (fp = NULL)return 1;getNextClutserId(fopen(IMAGE_FILE, r), 2);q
29、ueue_init();queue_new_task(Root, 0x00002600, 6144, 0);while (task = queue_get_task() != NULL)process_task(task);print_all_list();fflush(stdin);printf(nThe Number of File you want to view (enter -1 to exit): );scanf(%d, &choose);content = find_file_by_id(fp, choose, &status);if (status = MESSAGE_FILE
30、_NOT_FOUND)printf(Invaild Number, please input again!n);return 0;elseif (content != NULL)print_file_content(content);return 0;int process_task(struct queue_info* info)FILE *fp;struct file_content* content = NULL;int size = 0;fp = fopen(IMAGE_FILE, r);if (fp = NULL)return ERROR_IO_ERROR;/ 判斷是否對(duì)根目錄進(jìn)行讀
31、取if (info-offset = 0x00002600)content = readContentFromFixedSection(fp, info-offset, info-size);elsecontent = readContentFromCluster(fp, info-cluster, 1, &size);info-size = size;process_file_content(content, info);fclose(fp);return OK;int process_file_content(struct file_content* content, struct que
32、ue_info *info)struct folder_info *node = (struct folder_info *)malloc(sizeof(struct folder_info);struct file_info *newInfo = NULL;struct file_info_node *newInfoNode = NULL;char *content_char = (char *)content-content;int newId = -1, fileCount = 0;if (node = NULL)return ERROR_MALLOC_FAILED;node-filen
33、ame = info-filename;/ 根據(jù)大小計(jì)算目錄中的文件數(shù)量int maxFile = content-size / 32, i;for (i = 0; i filename0 != (char)0xE5 & newInfo-filename0 != (char)0x00) file_list_new_info(newInfo, &newId, &newInfoNode);if (newInfo-attributes & 0x10) = 0x10)if (newInfo-filename0 = .)continue;char *buffer = (char *)malloc(siz
34、eof(char)* 9);int j;for (j = 0; j filenamej != (char)0x20; j+)bufferj = newInfo-filenamej;bufferj = 0;queue_new_task(buffer, 0, 0, newInfo-pos);if (0 = fileCount)node-fileBeginIndex = newId;node-beginFile = newInfoNode;fileCount+;node-fileEndIndex = file_list_tail-id;node-endFile = file_list_tail;fo
35、lder_info_new_info(node);return OK;int copyTo(void *desc, void *src, int size)int counter = 0, i;for (i = 0; i info = info;newNode-next = NULL;if (file_list_head = NULL)newNode-id = 1;file_list_head = newNode;file_list_tail = newNode;elsenewNode-id = file_list_tail-id + 1;file_list_tail-next = newNo
36、de;file_list_tail = newNode;*newInfoNode = newNode;*id = newNode-id;return OK;int folder_info_init()folder_info_head = folder_info_tail = NULL;return OK;int folder_info_new_info(struct folder_info *info)if (info = NULL)return OK;if (folder_info_head = NULL)info-next = NULL;folder_info_head = info;fo
37、lder_info_tail = info;elseinfo-next = NULL;folder_info_tail-next = info;folder_info_tail = info;return OK;int queue_init()queue_head = queue_tail = NULL;return OK;int queue_new_task(char *filename, int offset, int size, int cluster)struct queue_info *newNode = (struct queue_info *)malloc(sizeof(stru
38、ct queue_info);if (newNode = NULL)return ERROR_MALLOC_FAILED;newNode-filename = filename;newNode-offset = offset;newNode-size = size;newNode-cluster = cluster;newNode-next = NULL;if (queue_head = NULL)queue_head = queue_tail = newNode;elsequeue_tail-next = newNode;queue_tail = newNode;return OK;stru
39、ct queue_info *queue_get_task()struct queue_info *retValue = queue_head;if (queue_head = NULL)return NULL;if (queue_head = queue_tail)queue_tail = NULL;queue_head = queue_head-next;retValue-next = NULL;return retValue;struct file_content* readContentFromFixedSection(FILE *fp, int offset, int size)if
40、 (fp = NULL)return NULL;struct file_content *retValue = (struct file_content *)malloc(sizeof(struct file_content);if (retValue = NULL)return NULL;retValue-curList = NULL;retValue-size = size;retValue-content = malloc(size);if (retValue-content = NULL)free(retValue);return NULL;fseek(fp, offset, SEEK
41、_SET);fread(retValue-content, size, 1, fp);return retValue;struct file_content* readContentFromCluster(FILE *fp, short clusterId, int isFolder, int *size)int curCount = 1;struct file_content *content = (struct file_content *)malloc(sizeof(struct file_content);if (content = NULL)return NULL;/ 第一步:迭代尋
42、找所有簇號(hào)content-curList = (struct int_linked_list *)malloc(sizeof(struct int_linked_list);if (content-curList = NULL)return NULL;struct int_linked_list *head = content-curList, *tail = head;head-data = clusterId;head-next = NULL;while (clusterId = getNextClutserId(fp, clusterId) != 0x00000FFF)curCount+
43、;tail-next = (struct int_linked_list *)malloc(sizeof(struct int_linked_list);tail-next-data = clusterId;tail-next-next = NULL;tail = tail-next;/ 第二步:開始根據(jù)簇號(hào)讀取content-size = curCount * 512;content-content = malloc(content-size);struct int_linked_list *ptr = head;int i = 0, address = 0xFFFFFFF;for (ptr = head; ptr != NULL; ptr = ptr-next, i+)address = 0x00003E00 + (512 * ptr-data);fseek(fp, address, SEEK_SET);fread(void *
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度幕墻工程環(huán)保材料采購(gòu)合同4篇
- 二零二五年度內(nèi)部經(jīng)濟(jì)責(zé)任承包合同信息化管理方案
- 2025版建筑包工合同(含建筑垃圾資源化利用)3篇
- 二零二五年度南陽農(nóng)業(yè)職業(yè)學(xué)院心理健康中心學(xué)生心理測(cè)評(píng)服務(wù)合同
- 2025版小區(qū)物業(yè)與社區(qū)居民共建和諧社區(qū)服務(wù)合同3篇
- 2025版學(xué)校產(chǎn)學(xué)研合作項(xiàng)目合同3篇
- 二零二五年酒店管理權(quán)及經(jīng)營(yíng)權(quán)轉(zhuǎn)讓合同3篇
- 土地交易居間合同樣本
- 二零二五年度區(qū)塊鏈技術(shù)應(yīng)用付款合同3篇
- 2025年度苗木種植與農(nóng)村產(chǎn)業(yè)結(jié)構(gòu)調(diào)整合同3篇
- 2025年溫州市城發(fā)集團(tuán)招聘筆試參考題庫含答案解析
- 2025版高考物理復(fù)習(xí)知識(shí)清單
- 除數(shù)是兩位數(shù)的除法練習(xí)題(84道)
- 2025年度安全檢查計(jì)劃
- 2024年度工作總結(jié)與計(jì)劃標(biāo)準(zhǔn)版本(2篇)
- 全球半導(dǎo)體測(cè)試探針行業(yè)市場(chǎng)研究報(bào)告2024
- (完整版)保證藥品信息來源合法、真實(shí)、安全的管理措施、情況說明及相關(guān)證明
- 營(yíng)銷專員績(jī)效考核指標(biāo)
- 畢業(yè)論文-山東省農(nóng)產(chǎn)品出口貿(mào)易的現(xiàn)狀及對(duì)策研究
- 音樂思政課特色課程設(shè)計(jì)
- 2023年四川省樂山市中考數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論