實驗四文件系統_第1頁
實驗四文件系統_第2頁
實驗四文件系統_第3頁
實驗四文件系統_第4頁
實驗四文件系統_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、word實驗四 文件系統班級: 姓名: 學號:實驗目的1. 學習Unix下對目錄文件信息的讀取。2. 學習Unix下對普通文件操作的系統調用。預備知識目錄文件操作所需頭文件:#include <dirent.h>所需系統調用:DIR* opendir(const char* dirname);功能:翻開一個目錄文件 成功 - 返回指向DIR類型對象的指針。失敗 - 返回NULL函數返回值DIR 代表一個目錄流的結構體int closedir(DIR *dirp);功能:關閉一個已經翻開的目錄文件成功 - 返回0;失敗 - 返回-1 struct dirent *readdir(DI

2、R *dirp);功能:讀取目錄流成功 - 返回指向struct dirent對象的指針,當前位置向后移。 失敗 返回NULLstruct dirent long d_ino; /* inode number 索引節點號 */ off_t d_off; /* offset to this dirent 在目錄文件中的偏移 */ unsigned short d_reclen; /* length of this d_name 文件名長 */ unsigned char d_type; /* the type of d_name 文件類型 */ char d_name NAME_MAX+1; /

3、* file name (null-terminated) 文件名,最長255字符 */文件操作所需頭文件#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>所需系統調用:int open(const char *pathname, int flag, mode_t mode)功能:翻開一個文件,第一個參數為要翻開文件的路徑,第二個參數為翻開文件的方式,第三個參數用于設定文件的權限位。返回值為所翻開文件的文件描述符。例子:int fd =

4、open(“./file, O_CREAT|O_TRUNC|O_RDWR, 0600);ssize_t write(int fd, const void *buf, size_t count)功能:像fd所指向的文件寫入count個單位的buf中的數據。第一個參數為要寫入文件的文件描述符;第二個參數為被寫入數據所在的緩存區;第三個參數為寫入單位個數。返回值:被成功寫入的單位個數,或-1表示出錯。例子:write(fd, buffer, 100);ssize_t read(int fd, void *buf, size_t count)功能:把fd所代表的文件中的內容從當前文件指針處文件指針用l

5、seek函數設定,默認為0,最開始讀取count個,然后存入buf中。返回值:成功讀取單位的個數,-1表示出錯。off_t lseek(int fd, off_t offset, int whence)功能:對fd所代表的文件的操作指針進行定位。第一個參數為要操作文件的文件描述符;第二個參數為偏移量,其具體意義根據第三個參數而定。第三個參數whence 有以下三個選項:SEEK_SET 直接重設文件操作指針,指針位置由第二個參數給出。SEEK_CUR重設文件指針,該選項表示把指針從當前位置根據第二個參數所給定的數值進行偏移,第二個參數為負數表示向前移動offset個單位,為正數代表向后移動of

6、fset個單位。SEEK_END將文件操作指針移動到文件末尾, 再進行offset個單位的偏移量。返回值:返回被重定位后的指針的偏移量從文件頭0開始計算)。例子:long file_length= lseek(fd, 0, SEEK_END);實驗內容1. 根據前面的預備知識,補全下面的程序,該程序可以顯示某個目錄文件中所包含的文件名稱及其所對應的i節點號。#include<stdio.h>#include<dirent.h>int main() DIR *dp; struct dirent *dirp; char dirname256; printf("Pl

7、ease input a directory: "); scanf("%s",dirname); if(dp = opendir(dirname) ) = NULL) printf("Can't open %sn", dirname); while(dirp = readdir(dp) ) != NULL) printf("%st%un", dirp->d_name , dirp->d_ino ); closedir(dp); return 0;2. 根據前面的預備知識,補全下面的程序,要求:該程序在磁盤

8、上創立一個文件file1,并按順序在file1中存入從A-Z的26個字母。#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>int main()int i;int fd;char buffer26="ABCDEFGHIJKLMNOPQRSTUVWXYZ"if(fd=open(“./file1,O_CREAT|O_RDWR,0600)write(fd, buffer, 26

9、);close(fd);return 0;3. 請寫出第二個程序,改程序要求翻開第一個程序所創立的文件,然后重定位當前翻開文件指針到file1的中間位置,然后讀取后面的所有信息并打印在屏幕上,完成屏幕打印后,將文件中的'N'、'O'兩個字母替換為'1'、'0',然后保存到文件file1中。#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <stdio.

10、h>int main()int i;int fd; char* c1=1; char* c2=0;char buffer13;if(fd=open(“./file1, O_RDWR,0600) file_length=lseek(fd,0,SEEK_END); lseek(fd, file_length/2,SEEK_SET);read(fd, buffer, file_length-file_length/2);printf(“%sn,buffer);lseek(fd,13,SEEK_SET);write(fd,c1,1);lseek(fd,0,SEEK_CUR);write(fd,c

11、2,1); close(fd);return 0;實驗結果1. 目錄操作程序運行結果截圖,在程序同一目錄中建立一個目錄“folder,然后向folder中隨意放置幾個文件,運行程序,在讓程序顯示“folder中的信息,文件名和文件所對應的i節點號。在截圖后請解釋該程序系統調用及其參數:scanf("%s",dirname);程序獲得文件名./folder存在字符串dirname中.dp = opendir(dirname)程序調用opendir(“./folder)翻開當前目錄下的目錄folder,并返回DIR結構體指針.if(dp = opendir(dirname) )

12、 = NULL)printf("Can't open %sn", dirname);假設dp為null,即文件不存在或有其他運行的問題,那么輸出Cant open ./folderwhile(dirp = readdir(dp) ) != NULL)printf("%st%un", dirp->d_name, dirp->d_ino);調用readdir(dp)方法讀取目錄下的文件并將每個文件對應的信息結構體dirent存入dirp.輸出dirp結構體中的文件名并對應的索引號i直到讀完所有文件,即dirp=null.closedir(

13、dp);目錄文件使用完畢,關閉文件.2. 文件操作第一個程序運行結果截圖先用ls -l列出當前目錄中的文件,然后運行第一個程序,再用cat命令顯示生成文件的內容,在截圖后請解釋該程序系統調用及其參數:char buffer26="ABCDEFGHIJKLMNOPQRSTUVWXYZ"定義字符串buffer26來存儲26個字母.fd=open(“./file1,O_CREAT|O_RDWR,0600)翻開(假設當前目錄下沒有file1那么創立并翻開)當前目錄下的file1文件(可進行讀寫操作),并返回int變量(所翻開文件的文件描述符)的給fd.write(fd, buffe

14、r, 26);向文件file1中寫入26個字符大小的字符串buffer.closedir(fp);文件使用完畢,關閉文件.3. 文件操作第二個程序運行結果截圖運行第二個程序,然后用cat命令顯示被修改正后的文件內容,在截圖后請解釋該程序系統調用及其參數。char* c1=1;char* c2=0;定義char*.fd=open(“./file1, O_RDWR,0600)翻開當前目錄下的file1文件(可進行讀寫操作),并返回int變量(所翻開文件的文件描述符)的給fd.file_length=lseek(fd,0,SEEK_END);獲得文件長度file_length.lseek(fd, file_length/2,SEEK_SET);重置文件指針于中間位置.read(fd, buffer, file

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論