標準IO |
文件IO |
遵循標準ANSIC |
遵循標準POSIX |
帶緩衝 |
無緩衝,每次都會執行系統調用 |
使用流 FILE 描述打開的文件 |
通過文件描述符 來描述打開的文件 |
文件IO介紹:
- posix(可移植操作系統接口)定義的一組函數
- 不提供緩衝機制,每次讀寫操作都引起系統調用
- 核心概念是文件描述符
- 訪問各種類型文件
- Linux下,標準IO基於文件IO實現
文件描述符
- 每個打開的文件都對應一個文件描述符
- 文件描述符是一個非負整數。Linux爲程序中每個打開的文件分配一個文件描述符
- 文件描述符從0開始分配,依次遞增
- 文件IO操作通過文件描述符完成
- 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 與完之後 與下面的幾種進行對比,查看是那種文件