檔案操作的系統呼叫之open,read

2021-08-05 19:19:46 字數 1840 閱讀 8485

#include #include #include #include #include #include #define size 1024

/*open()

#include #include #include int open(const char *pathname, int flags, mode_tmode);

pathname:要開啟或要建立的檔名稱

flags:標誌位,指定開啟檔案的操作方式

mode:指定新檔案的訪問許可權(僅當建立新檔案時才用)

返回值:若成功返回fp(檔案描述符),否則返回-1

*/int main1()

printf("fd = %d\n",fd);

//close(fd);

return 0;}/*

read()

#include ssize_t read(int fd, void *buf, size_t count);

fd:要讀取的檔案的描述符。

buf:讀取到的資料要放入的緩衝區。

count:要讀取的位元組數。

返回值:若成功返回讀到的位元組數,若已到檔案結尾則返回0,若出錯則返回-1並設定變數errno的值。

注意:1. 這裡的size_t是無符號整型,ssize_t是有符號整型。

2. buf指向的記憶體空間必須事先分配好。

*/int main2();

int fd = open("sqstack.c",o_rdwr ,077);

if(fd == -1)

ssize_t ret = read(fd,buf,size-1);

if(ret == -1)//出錯則返回-1

if(ret == 0)//若已到檔案結尾則返回0,成功返回讀到的位元組數,

printf("buf len = %d\n",strlen(buf));//檔案位元組數

printf("讀到第%d個位元組: %s \n",ret,buf);

return 0;

}//緩衝區問題

/*read每次讀的資料是呼叫者要求的大小,

比如呼叫要求讀取10個位元組資料,read就會讀10個位元組數

據到陣列中,而fread不一樣,為了加快讀的速度,

fread每次都會讀比要求更多的資料,然後放到緩衝區中,

這樣下次再讀資料只需要到緩衝區中去取就可以了。

*/int main3()

char buf[size] = ;

while(1)

if(ret == 0)//若已到檔案結尾則返回0,成功返回讀到的位元組數,

//2 buf[ret] = '\0';//每次讀完之後將末尾位元組置為'\0'

printf("%s\n",buf);

} #endif

//讀取乙個完整的資料

int fd = open("sqstack.c",o_rdonly ,0777);

if(fd == -1)

char buf[size] = ;

char *p = buf;

int count = size - 1;//每次要讀的資料個數

ssize_t ret = 0;

while(ret = read (fd, p, count))

break;

} if(ret == 0)//讀完資料

count -= ret;//下一次要都的資料

p += ret; }

printf("len = %d\n",strlen(buf));

printf("%s\n",buf);

return 0;

}

linux系統呼叫之檔案系統操作

access 確定檔案的可訪問性 chdir 改變當前工作目錄 fchdir 參見chdir chmod 改變檔案方式 fchmod 參見chmod chown 改變檔案的屬主或使用者組 fchown 參見chown lchown 參見chown chroot 改變根目錄 stat 取檔案狀態資訊 ...

系統呼叫之檔案訪問

1 write 系統呼叫 系統呼叫write 的作用是,把緩衝區 buf的前 nbytes 位元組寫入到與檔案描述符 fildes 關聯的檔案中,同時它會返回實際寫入的位元組數。如果返回 0,就表示為寫出任何資料 如果是 1,就表示在 write 系統呼叫中出現了錯誤,對應的錯誤碼儲存在全域性變數 ...

系統呼叫之lseek

注意 這個指標是和檔案描述符相掛鉤的,並不與這個檔案掛鉤,所以可以有多個程序來對這個檔案進行操作,不會影響各自。當從檔案讀取資料時,核心從指標指向的位置開始,讀取指定的位元組數,然後移動指標,指向下乙個未被讀取過的位元組,寫檔案的過程也是類似。off t oldpos lseek int fd,of...