檔案讀寫和檔案指標的移動
阿新 • • 發佈:2019-02-08
read 函式
-#include <unistd.h>
-ssize_t read(int fd, void *buf, size_t count);
從fd 所指的檔案中讀取count 個位元組到buf 中。返回實際讀取到的位元組數,有錯誤發生則返回-1。讀取檔案時,檔案讀寫指標會會隨著讀取到的位元組數移動。
write 函式
- #include <unistd.h>
- ssize_t write(int fd, const void *buf, size_t count);
把buf中的count個位元組寫入fd 所指的檔案中, 返回實際寫入的位元組數,有錯誤發生則返回-1。寫入檔案時,檔案讀寫指標會隨著寫入的位元組數移動。
lseek 函式:控制檔案指標的位置
-#include <sys/types.h>
-#include <unistd.h>
-off_t lseek(int fd, off_t offset, int whence);
offset 根據whence 來移動檔案指標的位移數
whence 取值 :
取值 | 含義 |
---|---|
SEEK_SET | 從檔案開始處向後移動 offset |
SEEK_CUR | 從檔案指標當前位置處向後移動 offset,負數時向前移動offset |
SEEK_END | 從檔案結尾處向後移動 offset,負數時向前移動offset |
成功返回當前的讀寫位置,也就是距離檔案開始處多少個位元組,錯誤返回-1
常用操作:
用法 | 含義 |
---|---|
lseek( int fd , 0,SEEK_SET) | 移動到檔案開頭 |
lseek(int fd, 0, SEEK_END) | 移動到檔案結尾i |
lseek(int fd, 0, SEEK_CUR) | 獲取當前位置(相對於檔案開頭的偏移量) |
例項:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
void my_err(const char *err_string ,int line )
{
fprintf(stderr,"line:%d " ,line) ; //fprintf()函式根據指定的格式(format)向輸出流(stream)寫入資料,把後面的寫到前面
perror(err_string) ;//先輸出err_string ,再輸出錯誤原因
exit(1) ;
}
int my_read(int fd) //讀資料函式
{
int len ;
int ret ;
int i ;
char read_buf[64] ;
if((lseek( fd , 0 ,SEEK_END))== -1) //移動檔案指標到結尾
my_err("lseek",__LINE__) ; //__LINE__ 預編譯器內建巨集,表示行數
if((len=lseek(fd,0,SEEK_CUR)) == -1 ) //求相對於檔案開頭的偏移量,用於表明檔案開始處到檔案當前位置的位元組數 len
my_err("lseek",__LINE__) ;
if((lseek(fd,0,SEEK_SET)) == -1 ) //移動檔案指標到開頭
my_err("lseek",__LINE__) ;
printf(" 位元組數是 : %d \n",len) ;
if((ret = read(fd,read_buf,len)) < 0) //成功時返回實際讀到的位元組數,失敗返回 -1
my_err("read",__LINE__ ) ;
for(i= 0 ;i< len ;i++)
printf("%c",read_buf[i]) ;
printf("\n") ;
return ret ;
}
int main(void)
{
int fd ;
char write_buf[32]="Hello Word !!" ;
if((fd =open("example_63.c",O_RDWR | O_CREAT |O_TRUNC ,S_IRWXU))== -1) //O_RDWR 可讀寫 O_CREAT 建立 O_TRUNC 檔案清空
my_err("open",__LINE__) ;
else{
printf("Creat file success !!\n") ;
}
if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //寫入檔案,write 的返回值是實際寫入的位元組數
my_err("write",__LINE__) ;
my_read(fd) ; //讀出資料
printf("/*--------------------------------------------*/\n") ;
if(lseek(fd,10,SEEK_END)== -1) //從檔案結尾處向後移動10位
my_err("lseek",__LINE__) ; //_LINE_ 預編譯器內建巨集,表示行數
if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //寫入檔案,write 的返回值是實際寫入的位元組數
my_err("write",__LINE__) ;
my_read(fd) ;
close(fd) ; //關閉檔案
return 0;
}
lseek 允許檔案指標移到EOF之後,會以\0 填充,但不會改變檔案大小。
預編譯器內建巨集有:
__LINE__ 行數
__TIME__ 時間
__FUNCTION__ 函式
__FINE__ 檔名