大家好!
今天主要和大家聊一聊,open函數的的flags标志,譬如:O_APPEND和O_TRUNC标志的使用方法。
目錄
第一:O_TRUNC标志使用方法
第二:O_APPEND使用方法
第一:O_TRUNC标志使用方法
使用該标志O_TRUNC的時候,調用open函數打開檔案的時候會将檔案原本的内容全部丢棄,檔案大小變為0;下面對檔案的操作代碼如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#icclude <stdlib.h>
int main(void)
{
int fd;
/* 打開檔案 */
fd = open("./test_file", O_WRONLY | O_TRUNC);
if (-1 == fd) {
perror("open error");
exit(-1);
}
/* 關閉檔案 */
close(fd);
exit(0);
}
在目前目錄下有一個檔案test_file,測試代碼中使用了O_TRUNC标志打開該檔案,代碼中僅僅隻是打開檔案,并沒有對其進行讀寫操作,接下來編譯運作來看看測試結果;
第二:O_APPEND使用方法
接下來聊一聊,使用O_APPEND标志方法,如果open函數攜帶并使用了O_APPEND标志,調用open函數打開檔案,當每次使用write()函數對檔案進行讀寫操作時,都會自動把檔案目前位置偏移量移動到檔案末尾,從檔案末尾開始寫入資料,也就是意味着每次寫入資料都是從檔案末尾開始。這裡我們直接進行測試,測試代碼如下所示:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char buffer[16];
int fd;
int ret;
/* 打開檔案 */
fd = open("./test_file", O_RDWR | O_APPEND);
if (-1 == fd) {
perror("open error");
exit(-1);
}
/* 初始化 buffer 中的資料 */
memset(buffer, 0x55, sizeof(buffer));
/* 寫入資料: 寫入 4 個位元組資料 */
ret = write(fd, buffer, 4);
if (-1 == ret) {
perror("write error");
goto err;
}
/* 将 buffer 緩沖區中的資料全部清 0 */
memset(buffer, 0x00, sizeof(buffer));
/* 将位置偏移量移動到距離檔案末尾 4 個位元組處 */
ret = lseek(fd, -4, SEEK_END);
if (-1 == ret) {
perror("lseek error");
goto err;
}
//讀取資料
ret=read(fd,buffer,4);
if(-1==ret)
{
perror("read error");
goto err;
}
printf("0x%x 0x%x 0x%x 0x%x\n", buffer[0], buffer[1],buffer[2], buffer[3]);
ret = 0;
err:
/* 關閉檔案 */
close(fd);
exit(ret);
}