1. 程式人生 > >檔案讀寫和檔案指標的移動

檔案讀寫和檔案指標的移動

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__     檔名

下一篇介紹關於檔案鎖的那些事.