Linux下文件IO

標準IO

文件IO

遵循標準ANSIC

遵循標準POSIX

帶緩衝

無緩衝,每次都會執行系統調用

使用流 FILE 描述打開的文件

通過文件描述符 來描述打開的文件

 

文件IO介紹:

  1. posix(可移植操作系統接口)定義的一組函數
  2. 不提供緩衝機制,每次讀寫操作都引起系統調用
  3. 核心概念是文件描述符
  4. 訪問各種類型文件
  5. Linux下,標準IO基於文件IO實現

 

文件描述符

  1. 每個打開的文件都對應一個文件描述符
  2. 文件描述符是一個非負整數。Linux爲程序中每個打開的文件分配一個文件描述符
  3. 文件描述符從0開始分配,依次遞增
  4. 文件IO操作通過文件描述符完成
  5. 1,2,3含義:分別對應標準輸入stdin 標準輸出stdout 標準錯誤stderr

打開文件—open

#include <fcntl.h>

int open(const char *pathname,int flags,mode_t mode);

成功時返回文件描述符,錯誤返回EOF

打開文件時使用兩個參數

創建文件時第三個參數指定新文件的權限

只能打開設備文件

第三個參數

R/W/X分別表示讀/寫/執行權限

S_IRUSR:用戶讀權限

S_IWUSR:用戶寫權限

S_IRGRP:用戶組讀權限

S_IWGRP:用戶組寫權限

S_IROTH:其他組都權限

S_IWOTH:其他組寫權限

 

關閉文件—close()

#include <unistd.h>

int close(int fd);

 

成功時返回0;出錯返回EOF

程序結束時自動關閉所有打開的文件

文件關閉後,文件描述符不再代表文件

讀文件—read()

#include <unistd.h>

Ssize_t read(int fd,void *buf,size_t count);

 

成功時返回實際讀取到的字節數,出錯返回EOF

讀到文件末尾返回0

buf是接收緩衝區

count不應超過buf大小

寫文件—write()

ssize_t write(int fd,void *buf,size_t count);

成功時返回實際寫入字節數,出錯返回EOF

buf是發送數據的緩衝區

count不應超過buf大小

定位文件—lseek()

#include <unistd.h>

off_t lseek(int fd,off_t offset,int whence);

成功時返回當前文件讀寫位置,出錯返回EOF

whence參數:基準點

              SEEK_SET 文件開始位置

              SEEK_CUR 文件當前讀寫位置

              SEEK_END 文件末尾

              offset 偏移量,可正可負

              0 文件開始位置

              流的讀寫位置 = 偏移量 + 基準點

 

使用文件IO對文件進行復制

#include <stdio.h>

#include <unistd.h>

#include <fcntl.h>

#include <errno.h>

#include <string.h>

 

#define N 64

 

int main(int argc,char *argv[])

{

       int fds,fdt,n;

       char buf[N];

 

       if(argc < 3)

       {

              printf("Usage : %s <src_file> <dst_file>\n",argv[0]);

              return -1;

       }

       if((fds = open(argv[1],O_RDONLY)) == -1)

       {

              //fprintf(stderr,"open %s :%s\n",argv[1],perror(errno));

              return -1;

       }

       if((fdt = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0666)) == -1)

       {

       //     fprintf(stderr,"open %s : %s\n",argv[2],perror(errno));

              return -1;

       }

       while((n = read(fds,buf,N)) > 0)

       {

              write(fdt,buf,n);     

       }

       close(fds);     

       close(fdt);

}

 

 

 

訪問目錄

opendir()是用來打開一個目錄文件

#include <dirent.h>

DIR *opendir(const char *name);

 

DIR是用來描述一個打開的目錄文件的結構體類型

成功時返回目錄流指針,失敗返回NULL

 

readdir()函數用來讀取目錄流中的內容

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

 

struct dirent 是用來描述目錄流中一個目錄項的結構體類型

包含成員char d_name[256] 參考幫助文檔

成功時返回目錄流dirp中下一個目錄項,出錯或者到末尾返回NULL

 

closedir() 函數關閉一個目錄文件

#include <dirent.h>

int closedir(DIR *dirp);

 

成功返回0,出錯返回EOF

 

修改文件訪問權限

#include <sys/stat.h>

int chmod(const char *path,mode_t mode);

int fchmod(int fd,mode_t mode);

 

成功返回0 失敗返回EOF

root 和文件所有者能修改文件的訪問權限

示例 chmod(“test.txt”,0666);

獲取文件屬性—stat/lstat/fstat/

#include <sys/stat.h>

int stat(const char *path,struct stat *buf);

int lstat(const char *path,struct stat *buf);

int fstat(int fd,struct stat *buf);

 

成功時返回0  失敗返回EOF

若path是符號鏈接   stat獲取的是目標文件的屬性;而lstat獲取的是鏈接文件的屬性

 

struct stat是存放文件屬性的結構體類型:
mode_t  st_mode      類型和訪問權限

uid_t  st_uid                  所有者id

uid_t  st_gid                  用戶組id

off_t  st_size                文件大小

time_t  st_mtime           最後修改時間

 

文件類型

S_ISREG ( ) 普通文件

S_ISDIR ( ) 目錄文件

S_ISCHR ( ) 字符特殊文件

S_ISBLK ( ) 塊特殊文件

S_ISFIFO ( ) 管道或F I F O

S_ISLNK ( ) 符號連接( P O S I X . 1或S V R 4無此類型)

S_ISSOC K ( ) 套接字(P O S I X . 1或S V R 4無此類型)

 

st_mode 和 0170000 與完之後 與下面的幾種進行對比,查看是那種文件

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章