天天看點

【IO程序】檔案IO【1】檔案IO【2】擷取檔案屬性資訊stat【3】 目錄【4】庫

【1】檔案IO

必須使用作業系統提供輸入輸出函數來實作檔案的讀寫、定位操作,不能在其他的系統中使用。

檔案描述符:  實際上是一個非負的整形資料,檔案指針是檔案描述的一個軟連接配接
 最大資料:0 ~ 1023   打開得檔案袋描述符的個數是1024個            
 無緩沖:   


 檔案IO對比标準IO:标準IO通過對正常檔案進行操作,檔案IO通常對特殊檔案記性操作;檔案IO也可以對正常檔案進行讀寫、定位操作。

 1、打開或者建立
    open(pathname ,flags, mode)//打開

    umask就是用來修改檔案權限,
    在建立檔案時,可以通過umask對檔案權限進行修改,修改方式
    mode & ~umask
    (1)先檢視umask是多少?
    (2)設定umask值是多少?
    (3)建立檔案,然後通過ll  filename  檢視檔案的全限
    注意:程式設計umask函數來修改

    pathname  指定的檔案名字

    flags      
          讀寫操作方式:
          O_RDONLY  讀操作
          O_WRONLY  寫操作
          O_RDWR    讀寫操作

          O_CREAT   建立檔案
          O_EXCL   表示檔案已經存在,而又重複建立一次,open函數會傳回錯誤,
                    傳回檔案已經存在的錯誤,對錯誤做處理之後,直接打開檔案就可以
          O_APPEND   從檔案末尾位置追加寫入

          open(argv[1], O_RDONLY)
          open(argv[1], O_WRONLY | O_CREAT | O_TRUNC , 0666)
          open(argv[1], O_WRONLY | O_CREAT | O_APPEND, 0666)

       檔案IO和标準IO的等價形式:
          r   <-->  O_RDONLY
          r+  <-->  O_RDWR 
          w   <-->  O_WRONLY | O_CREAT | O_TRUNC
          w+  <-->  O_RDWR   | O_CREAT | O_TRUNC
          a   <-->  O_WRONLY | O_CREAT | O_APPEND
          a+  <-->  O_RDWR   | O_CREAT | O_APPEND


 2、讀寫、定位
    read、write、lseek

    ssize_t read(int fd, void *buf, size_t count);
    功能: 從指定的檔案中讀取資料
    參數:  
    fd  指定的檔案,通過open函數傳回的檔案描述符
    buf  從檔案當中讀取資料存放到使用者程式空間當中,事先定義數組或者
        變量傳遞着位址
    count  要求從檔案中讀取多少位元組的資料
    傳回值:
          成功  傳回實際讀取的位元組數
          失敗  -1
          從指定位置讀取資料時如果指定位置沒有資料read,就會産生阻塞


    ssize_t write(int fd, const void *buf, size_t count);
            功能: 往指定的檔案中寫入資料
    參數:  
    fd  指定的檔案,通過open函數傳回的檔案描述符
    buf  從使用者程式空間當中讀取資料寫入到檔案,事先定義數組或者
        變量傳遞着位址
    count  要求往檔案中寫入多少位元組的資料
    傳回值:
          成功  傳回實際寫入的位元組數
          失敗  -1

    off_t lseek(int fd, off_t offset, int whence);
    功能:  重新定位檔案位置指針
    參數:
        fd  open函數打開的檔案
        whence  基準點
              SEEK_SET
              SEEK_CUR 
              SEEK_END
        offset    正數往檔案的末尾位置偏移,負數往檔案的開頭位置偏移,0表示不移動。
        lseek(fd, 5, SEEK_SET);  
        lseek(fd, 0, SEEK_SET);
        lseek(fd, 5, SEEK_CUR);
        lseek(fd, -5, SEEK_CUR);
        lseek(fd, 0, SEEK_CUR);
        lseek(fd, 5, SEEK_END);
        lseek(fd, -5, SEEK_END);
        lseek(fd, 0, SEEK_END);


 3、關閉
    close
  od  -c  filename  可以檢視檔案中的資料資訊,顯示到終端上    
           

【2】擷取檔案屬性資訊stat

int stat(const char *path, struct stat *buf);
 功能:擷取檔案屬性資訊函數
 參數:
      path  表示要擷取哪個檔案的屬性資訊
      buf   需要事先定義一個結構體變量,用來存儲path指向的那個檔案袋額屬性資訊。
傳回值:
    成功  0
    失敗  -1
           

【3】 目錄

打開目錄操作
opendir

 #include <dirent.h>

   DIR *opendir(const char *name);
   功能:打開目錄
   參數:
        name   目錄的名字
   傳回值:
        成功  DIR* 
        失敗  NULL

讀取目錄資訊
struct dirent *readdir(DIR *dirp);

struct dirent {
           ino_t          d_ino;       /* inode number */
           off_t          d_off;       /* offset to the next dirent */
           unsigned short d_reclen;    /* length of this record */
           unsigned char  d_type;      /* type of file; not supported
                                          by all file system types */
           char           d_name[256]; /* filename 檔案的名字*/
       };


 功能:  讀取目錄中的檔案資訊
 參數:
      dirp  你要讀取的目錄是哪一個? 有opendir傳回
 傳回值:
        成功:  struct dirent *(事先頂一個變量接受檔案的資訊)
        失敗   NULL(做判斷,是否到大檔案結束或者讀取失敗)



關閉目錄
closedir(DIR*)
           

【4】庫

(1)什麼是庫?
  庫其實就是一個經過編譯之後的二進制檔案,可以被執行,但是不能單獨執行,庫中存放的函數功能的實作,供使用者程式調用,然後把程式中調用函數從庫中添加你的可執行程式中。

 (2)庫的分類
靜态庫:
    編譯  可執行程式的時候,把庫中的代碼添加可執行程式中,添加完之後,跟靜态庫沒有任何的關系,檔案的大小會變大。執行效率會更高一些
動态庫:(共享庫)
    可以被多個程式(程序)共同通路的庫,可執行運作起來之後,去記憶體中,找到共享通路共享庫中的代碼隻是在運作通路,程式接續不在通路檔案的大小沒有變大。相對來說效率更低一些。

 (3)庫的制作流程
    靜态庫
        a、确定函數的功能,添加檔案file.c中,   把檔案制作成庫
        b、庫的組成部分是由.o檔案組成,生成.o檔案
        c、把.o檔案制作成庫   
                靜态庫是.a為字尾。以lib開頭, 兩者之間加上庫的名字  libadd.a
                ar  -crs    libmymath.a mymath.o
                      c  建立
                      r  插入
                      s  索引
                庫的名字自己定義

        d、編譯程式通路庫 
                  指定庫的路徑  -L(表示指定路徑) .(表示目前目錄)   
                  指定庫檔案的名字  -l(指定檔案的名字) add

          gcc main.c -o main  —L . -ladd

    共享庫:
        共享庫是.so為字尾。以lib開頭, 兩者之間加上庫的名字  libadd.so
        a、gcc  -fPIC  -c mamath.c -o mymath.o
                -fPIC指定位置無關代碼(隻要系統把共享庫加載到記憶體合适的空間中就可以)

        b、gcc  -shared mymath.o -o libmymath.so

                -shared  共享(可以被多個程式調用)
        c、gcc  main.c -o main -L . -lmymath
        執行可執行程式,你會發現不能執行,引文系統找不到庫所在的路徑,使用者必須添加路徑
        d1、cp  libmymath.so /lib或者/usr/lib
        d2、設定共享庫的環境變量LD_LIBRARY_PATH(絕對路徑)
            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/linux/io-day1/io-day2/dymaic

        d3、添加配置檔案在配置檔案中,生成一個.conf的檔案,在檔案中添加共享庫的絕對路徑
            cd /etc/ld.so.conf.d
            sudo vi mymath.conf
            在檔案中添加/home/linux/io-day1/io-day2/dymaic就可以。

        【注意】
            添加完之後,必須對配置檔案進行重新整理操作
            使用ldconfig

            删除/etc/ld.so.conf.d/libmymath.so時,必須必須重新整理配置檔案
            使用ldconfig