- open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);?? ?
功能:
打開文件?
參數:
@pathname --- 文件名?
@flags?
必選:
O_RDONLY
O_WRONLY
O_RDWR
附加:
O_APPEND //追加 ---寫?
O_CREAT ?//創建?
O_TRUNC ?//截斷?
@mode
表示創建文件的權限 --- 只有前面有O_CREAT時,才需要指定?
0777
0666
返回值:
成功 返回文件描述符?
失敗 -1 &&errno?
fopen("1.txt", "r") ?---> open("1.txt",O_RDONLY);
fopen("1.txt","r+") ?---> open("1.txt",O_RDWR);
fopen("1.txt", "w") ?---> open("1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
fopen("1.txt","w+") ?---> open("1.txt",O_RDWR|O_CREAT|O_TRUNC, 0666);
fopen("1.txt", "a") ?---> open("1.txt",O_WRONLY|O_APPEND|O_CREAT, 0666);
fopen("1.txt","a+") ?---> open("1.txt",O_RDWR|O_APPEND|O_CREAT, 0666);
//流指針 ?<----> ?文件描述符 ?
stdin ? ? ? ? ? ? ?0
stdout ? ? ? ? ? ? 1
stderr ? ? ? ? ? ? 2
實際的文件權限:
- rw- r-- r--?
110 100 100
6 ? 4 ? 4?
mode & ~umask?
110 110 110 mode?
000 010 010 umask?
111 101 101 ~umask?
110 110 110 mode?
& ? 111 101 101 ~umask?
-----------------
110 100 100 //644
ssize_t read(int fd, void *buf, size_t count);
功能:
從fd對應文件中讀取數據,讀count個字節,存放到buf指定的一塊空間?
參數:
@fd ? ?就是要讀取的文件?
@buf ? 存放數據的空間?
@count 要讀取的字節數
返回值;
成功 讀取到的字節數?
失敗 -1 &&errno?
練習:
cat //open + read?
注意:
read讀到的數據,如果要當作字符串處理,
注意,需要手動處理成字符串?
ssize_t write(int fd, const void *buf, size_t count);
功能:
從buf中獲得數據,寫count個字節到 fd對應文件中
參數:
@fd ? ?就是要寫的文件?
@buf ? 存放數據的空間?
@count 要寫入的字節數
返回值;
成功 寫入的字節數?
失敗 -1 &&errno ?
練習:
用read 和 write實現文件拷貝?
lseek
off_t lseek(int fd, off_t offset, int whence);
功能:
將fd定位到從whence開始的offset的位置?
參數:
@fd 文件?
@offset 偏移量?
@offset ? --- 偏移量?
>0 ? //需要考慮參考點是否可以?
<0?
@whence ? --- 參考點?
SEEK_SET ?//文件開頭?
SEEK_CUR ?//文件當前位置?
SEEK_END ?//文件結尾
定位開頭:
lseek(fd,0,SEEK_SET);
定位到末尾
lseek(fd,0,SEEK_END);
返回值:
成功 返回從文庫開頭到當前定位處的偏移量?
失敗 -1 && errno?
//獲得文件大小?
off_t len = lseek(fd,0,SEEK_END); //off_t //long int型?
?創建空洞:
1.定位?
2.寫操作?
write ??
練習:
輸入一個文件,創建一個 同樣大小的空洞文件?
功能:
統計行數?
fgets?
日志?
fd = open
read
fgets(fp);
fprintf()
write
標準IO --- FILE * fp
文件IO --- fd?
FILE *fp ---> fd?
int fileno(FILE *stream); //將FILE *fp 流指針轉換為 fd?
fd ---> FILE *fp?
FILE *fdopen(int fd, const char *mode);
功能:
將 fd 對應文件打開 關聯一個 FILE * 指針?
fd = ?open("1.txt",O_RDONLY);
fdopen(fd,"r+");