函數接口
1 .open和close
文件描述符:系統為用open打開的文件分配的標識符
非負的整形數據
0-1023
最小未被使用原則
使用完時及時釋放,避免文件描述符溢出
文件描述溢出就是文件使用完沒有及時關閉文件
int open(const char *pathname, int flags); //打開一個已有文件int open(const char *pathname, int flags,int mode);//O_CREAT + 權限功能:獲得一個文件描述符參數:pathname:文件名flags:必flags:O_RDONLY : 只讀O_WRONLY: 只寫O_RDWR : 讀寫O_CREAT :不存在則創建O_TRUNC : 清空文件O_APPEND:追加寫"r" : O_RDONLY;"r+" : O_RDWR ;"w" : O_WRONLY | O_CREAT | O_TRUNC ; 0664"w+" : O_RDWR | O_CREAT | O_TRUNC ; 0664"a" : O_WRONLY | O_CREAT | O_APPEND; 0664"a+" : O_RDWR | O_CREAT | O_APPEND; 0664mode:對文件的操作權限當flags中有 O_CREAT標志時,必須填寫mode參數,一般加0664就好返回值:成功返回文件描述符 (最近最小未使用的一個數字)文件描述符:系統為已打開的文件分配的標識符非負的整形數據0-1023最小未被使用原則使用完時及時釋放,避免文件描述符溢出失敗返回-1例 int fd = open("1.txt",O_WRONLY|O_CREAT,0666);close(int fd);默認打開流和描述符對應
int FILE *
STDIN_FILENO------->0 : 標準輸入設備 -----》(stdin)
STDOUT_FILENO---->1 :標準輸出設備 -----》(stdout)
STDERR_FILENO---->2:標準出錯設備 -----》(stderr)
2.write和read
3.writechar buf[1024];ssize_t write(int fd, const void *buf, size_t count);功能://通過文件描述符向描述符指的文件中寫一串數據,數據來源是buf參數:fd:文件描述符buf:要寫入文件的字符串的首地址count:要寫入字符的個數返回值: 成功返回實際寫入的個數失敗返回-14.readssize_t read(int fd, void *buf, size_t count);功能:通過文件描述符讀取描述符指向的文件中的數據,放到buf、參數:fd:文件描述符buf:存放數據空間的首地址count:要讀到數據的個數返回值:成功返回讀到數據的個數失敗返回-1讀到文件結尾返回0
使用文件IO實現cat功能;
使用文件IO實現cp功能;
cat
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc , char *argv[]){int fp = open(argv[1],O_RDWR);if(fp == -1){printf("not open\n");return -1;}char buff[1024] = {};int ret = read(fp,buff,1024) ;while(ret != 0){write(1,buff,1024);ret = read(fp,buff,1024);}close(fp);
}
copy
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc , char *argv[]){int fp = open(argv[1],O_RDWR);int fq = open(argv[2],O_RDWR|O_TRUNC);if(fp == -1 || fq == -1){printf("not open\n");return -1;}char buff[1024] = {};int ret = read(fp,buff,1024) ;while(ret != 0){int rt = write(fq,buff,ret);ret = read(fp,buff,1024);}close(fp);close(fq);
}
3文件定位函數:lseek
off_t lseek(int fd, off_t offset, int whence);
功能:實現文件操作位置偏移
參數:fd:描述符offset:偏移量whence:偏移的相對位置SEEK_SETSEEK_CURSEEK_END
返回值:成功:返回文件當前操作位置到文件開頭的偏移量失敗:-1
4.系統io和文件io
文件對底層操作,速度快,一般操作硬件對應的設備文件
標準io是在文件的基礎上增加了緩沖區,提高對普通文件操作的效率。
5.緩沖區
輸出緩沖區
行緩沖,1k, terminal,主要用于人機交互--- stdout ---終端緩存區滿或者遇到\n刷新 1024行緩存多是關于終端的一些操作1.遇到 \n刷新(printf)2.緩存區滿刷新3.程序結束刷新4.fflush刷新 fflush(stdout); //強制刷新 全緩沖,4k,主要用于文件的讀寫 --- 普通文件的操作緩存區滿刷新緩存區 4096對普通文件進行標準IO操作,建立的緩存一般為全緩存刷新條件:1.緩存區滿刷新(滿4096刷新到文件內一次)2.程序結束刷新3.fflush來刷新 fflush(fp);4.文件關閉刷新無緩沖,0k 主要用于出錯處理信息的輸出 stderr 不對數據緩存直接刷新printf();==>>stdout //有緩沖fprintf(stderr,"fopen error %s",filename);//無緩沖流stderr無緩沖界面交互 出錯處理