一、文件的打開創建
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);
?flags: O_RDONLY 只讀
? ? ? ? O_WRONLY 只寫
? ? ? ? O_RDWR? 可讀可寫
int open(const char *pathname, int flags, mode_t mode);
如果 沒有該文件:
flags:?
打開文件,如果沒有,創建一個
O_CREAT: open("file1",O_RDWR|O_CREAT,0600); //這里的0600 是權限
?//打開文件,如果沒有,創建一個,如果有返回-1
O_EXCL: open("file1",O_RDWR|O_CREAT|O_EXCL,0600);
?//打開文件,從文件尾部開始寫入,不覆蓋前面的內容
O_APPEND: open("./file1",O_RDWR|O_EXCL);
?//可讀可寫的方式打開文件,刪除原文件所有內容,從新寫入
O_TRUNC: open("./file1",O_RDWR|O_TRUNC);
二、文件的寫入
write 的函數原型#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
需要包含這個 頭文件,把buf這個緩存區的 count 個字節 寫到fd中
如果成功了的話,返回的為寫入個個數,否則為-1
三、文件的讀取
原型
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
read()嘗試從文件中讀取最多count個字節 fd從buf開始進入緩沖區。
我們在寫入文件的時候,最后會導致光標在文件末尾。如果直接read 會導致讀取失敗。
目前有兩個方法,解決。
第一個:寫完文件后,關閉文件重新打開,能讓光標回到起始位置。
//第二個:#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);fd:所表述的文件offset :光標偏移的個數。如果為正數則向后偏移,whence(從哪里偏移呢?):1、SEEK_SET: 把光標偏移文件頭部2、SEEK_cur: 把光標放在當前位置3、SEEK_END: 把光標放在文件尾部
四、cp指令的實現
/*實現文件復制的步驟
1.打開源文件和目標文件,如果沒有創建一個,如果有刪除里面內容。
2.讀取源文件的內容
3寫到目標文件中。
4關閉文件
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>#include <unistd.h>#include<stdio.h>int main(int argc,char** argv)
{int fdSrc;int fdDes;char *readBuf = NULL; //通過參數判斷指令是否正確if(argc != 3){printf("error\n");exit(-1);}fdSrc = open(argv[1],O_RDWR); //打開源文件int size = lseek(fdSrc,0,SEEK_END);lseek(fdSrc,0,SEEK_SET); // 通過lseek()判斷源文件大小,注意要把光標回到開頭readBuf = malloc(sizeof(char*)*size + 8);int n_read = read(fdSrc,readBuf,1024); //避免內存浪費,可用size 代替fdDes = open(argv[2],O_RDWR|O_CREAT,0600);int n_write = write(fdDes,readBuf,strlen(readBuf));close(fdSrc);close(fdDes);return 0;
}
?