系統io(檔案io)

2022-07-02 10:48:15 字數 4798 閱讀 2016

檔案描述符:

檔案描述符:已開啟檔案的標誌,是非負整形數,當前可以最小作為新檔案的檔案描述符,預設範圍0-1024(可更改)。
檔案開啟:

int open(const char *pathname, int flags, mode_t mode);

1. pathname:要開啟檔案的路徑

2. flags:開啟方式

1.o_rdonly 唯讀

2.o_wronly 只寫

3.o_rdwr 讀寫

**上述常量三選一**

**下列可選擇的:**

o_trunc 如果檔案存在將其截短為0。

o_creat 建立檔案,使用此時,指定檔案許可權位。 檔案許可權位 & ~umask(遮蔽字).

3.mode:mode & ~umask建立檔案的許可權

4. 返回值:成功返回檔案描述符,失敗返回-1 並且設定 errno

讀:

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

1. fd:待讀取的檔案的檔案描述符

2. buf:儲存讀取到的資料

3. count:buf大小

4. 返回值:成功返回讀到的位元組個數,失敗返回-1,讀到結尾返回 0 .

寫:

ssize_t write(int fd, const void *buf, size_t count);

1. fd:要寫入的檔案的檔案描述符

2. buf:儲存待寫入的資料

3. count:待寫入的位元組個數

4. 返回值:成功返回寫入的位元組個數,失敗返回-1.

設定檔案偏移量:

off_t lseek(int fd, off_t offset, int whence);

1. fd:要寫入的檔案的檔案描述符

2. offset:要偏移的位元組個數

3. whence:設定從何處開始偏移

1. seek_set 檔案開頭

2. seek_cur 從當前位置

3. seek_end 檔案末尾

4. 返回值:成功返回當前檔案偏移量,若出錯返回-1.

關閉:

int close(int fd);
檔案共享:

1. 程序表項:每乙個程序有乙個

2. 檔案表:每開啟乙個檔案

3. v結點表:乙個檔案乙個

檔案共享

檔案描述符的複製--》重定向:

1. int dup(int oldfiledes)//識別符號,當前可用最小檔案描述符最為oldfd的賦值

返回值:返回當前可用檔案描述符中的最小數值,出錯返回-1.

2. int dup2(int oldfd, int newfd);//如果newfd被占用了,先關掉,讓newfd作為oldfd的賦值。dup2能夠指定fd給oldfd賦值

返回值:成功返回檔案新的描述符,出錯返回-1.

3. ./a.out > outfile 2>&1

dup2(fd, 1);

dup2(1, 2);

4. ./a.out 2>&1 > outfile

dup2(1, 2);

dup2(fd, 1);

fcntl(2):

int fcntl(int fd, int cmd, /* int arg */)檔案描述符, 功能描述符, 第三個引數是乙個整數,指向結構體的指標。

fcntl函式的5種功能:

1.複製乙個現有的描述符。(cmd = f_dupfd)(很少用)

2.獲得/設定檔案描述標記。(cmd = f_getfd / f_setfd)

3.獲得/設定檔案狀態標誌。(cmd = f_getfl / f_setfl)

4.獲得/設定非同步i/o所有權 (cmd = f_getown/f_setown)

5.獲得/設定記錄鎖 (cmd = f_getlk/cmd = f_setlk/ cmd = f_setlkw)

1. 檔案流:file結構:fd,buf,bufsize,errflag;標準io開啟檔案的標記

2. 標準輸入檔案流stdin 標準輸出檔案流stdout 標準錯誤輸出stderr

3. 快取

1. 行快取stdout/stdin

2. 無快取stderr

3. 全快取 (普通檔案)

4. 如何重新整理快取區

1. 行緩衝遇到'\n'

2. 全快取寫滿了

3. 程序終止了

4. fflush(3) //強制重新整理快取

5. 開啟

1. file *fopen(const char *path, const char *flag);//1.檔案開啟路徑,2.以哪種方式開啟檔案

返回值檔案流

1. flag:r/r+/w/w+/a/a+

r: 讀

r+ 可讀可寫

w 把檔案截短為0,或為寫而建立。

w+ 把檔案截短為0,或為讀和寫而開啟

a 新增,在檔案末尾寫而開啟。或為寫而建立

a+ 為在檔案末尾寫而開啟或建立

6. 讀寫

1. 位元組

1. fgetc(3) / fputc(3) getc(3) / putc(3) getchar(3)/putchar(3)

fgetc(3):int fgetc(int c,file* fp)引數:file* 指標

功能:讀取乙個字元

fputc(3): int fputc(int c, file * stream)//int c 轉換成無符號字元,寫進要寫進的檔案流中

將指定輸出項 輸出到乙個指定流上,包括標準輸出流,標準出錯流,以及任何乙個已經成功開啟的流(檔案),將轉換為無符號字元的字元c寫入流

getc(3) :

從任何成功開啟的流中獲取內容,包括標準輸入以及已經存在的檔案中。getc()會被定義成巨集使用

putc(3) :int putc(int c,file * stream)//int c 轉換成無符號字元,寫進要寫進的檔案流中

將指定輸出項 輸出到乙個指定流上,包括標準輸出流,以及任何乙個已經成功開啟的流(檔案),它可以作為乙個巨集來實現

getchar(3):int getchar(void);

從標準輸入讀入乙個字元(函式引數是標準輸入,即終端)

putchar(3):

把指定的字元輸出到標準輸出(即終端)

2. 行

1. fgets(3) / fputs(3) puts(3)

fgets(3) : char *fgets(char *buf, int size, file *fp);//從後往前:從檔案流中讀,讀多少位元組,讀到快取中去。

返回值:成功返回s,已達到檔案末尾或失敗則返回null。

fputs(3):  int fputs(const char *s, file *stream);//唯讀的緩衝區,檔案流

返回值:成功返回非負數,失敗返回eof

puts(3):int puts(const char *s);//指標所指向的內容

返回值:成功返回非負數,失敗返回eof

3. 二進位制

1. int fread(char *buf, int size, int nmemb, file *fp);//要讀到的地方,單個元素大小,多少個元素,從檔案流中讀

2. int fwrite(const char *buf, int size, int nmemb, file *fp);//從快取中讀,單個元素大小,多少個元素,寫入檔案流中

如果成功,fread()和fwrite()將返回讀或寫的專案數量。這個數字等於僅在size為1時傳輸的位元組數。如果乙個錯誤oc‐curs,或到達檔案的結尾,返回值是乙個短的專案計數(或0)。

fread()不區分檔案結束符和錯誤,呼叫者必須使用feof(3)和ferror(3)來確定發生了什麼。

4. 格式化

1. printf(3) / scanf(3)

2. fprintf(3) / snprintf(3)

7. 關閉

1. fclose(3)

8. 偏移量(定位檔案流位置)

1.fseek(3) / ftell(3)(獲得檔案偏移量)/rewind(3)(檔案偏移量回到檔案開頭)

int fseek(file *stream, long offset, int whence); 返回值:成功返回0,失敗返回非0值。

long ftell(file *stream);獲得檔案偏移量。

void rewind(file *stream);功能:將當前檔案的偏移量置為0

9. 臨時檔案

1. tmpfile(3) //成功返回檔案指標,失敗返回null

檔案io:

系統呼叫

實時性高

效率低不能跨平台

標準io:

庫函式帶快取區

合併系統呼叫,減少io次數,提高效率,能合併系統呼叫是因為它帶快取區

實時性低

linux檔案IO的系統IO和標準IO理解

儲存在硬碟等物理儲存器上的檔案如何進行讀取等操作?如果我們直接對其進行讀寫等操作,也是可以滴,不過這就需要很費時費力,需要對硬體的物理構造有清楚的了解,很明顯,這很影響開發效率。當然也不排除某些特殊場合需要用到,但是大多數情況下,這種 低階的 操作,早已經被人們開發出來的乙個叫做 作業系統 的東西給...

系統檔案I O介面

檔案io是指對檔案進行資料輸入與資料輸出,我們程式的本質就是對輸入的資料進行處理然後輸出,可是資料是在檔案中的,在linux下一切皆檔案,所以程式就是要實現對檔案的讀寫操作 可是我們程式不能直接去操作檔案,這個時候就需要系統提供呼叫介面來供我們使用從而根據系統介面處理讀寫資料。我們在c語言中學習的幾...

檔案系統之標準IO與系統呼叫IO

io操作是我們程式執行的基礎,資料在程式執行結束時需要儲存就必須使用io操作。io主要包括兩類 標準io與系統io 一 標準io 標準io是為了避免跨平台移植引起的不必要異常,指定的一系列標準函式,無論linux windows都可以使用。標準io常用api包括 fopen fwrite fread...