APUE 再讀之 標準IO庫

2021-07-08 14:45:14 字數 3216 閱讀 8135

本章介紹標準io庫

1. file物件

標準io庫一切函式基於file物件。file物件包含了管理該流的所有資訊: 檔案描述符,指向流快取的指標,快取的長度,快取的位元組數以及出錯標識等

2. 標準輸入,標準輸出和標準出錯。

對應非標準io: stdin_fileno, stdout_fileno,stderr_fileno

對於標準io: stdin,stdout,stderr.

3. 快取

為了盡可能減少使用read和write呼叫的數量,標準io提供快取。全快取,行快取和不快取。

當且僅當不涉及互動裝置的時候,他們才是全快取的。標準出錯不會是全快取。

#include void setbuf(file* fp, char* buf)

int setvbuf(file* fp, char* buf, int mode,size_t size); int fflush(file* fp) //強制重新整理流

4. 開啟流

#include file *fopen(const char* pathname,const char* type);

file *freopen(const char* pathname,const char* type,file* fp);

file *fdopen(int filedes,const char* type)

int fclose(file* fp);

type 為:

r,rb,w,wb,a,ab,r+,r+b,rb+,w,w+b,w。 w把檔案截斷為0, a定位檔案到末尾。b 為二進位制檔案讀寫。

freopen 的妙用:用檔案冒充stdin,stdout

#include int main()

5.讀和寫流的方式

每次處理乙個字元;每次處理一行;直接io。

6.字元讀

#include int getc(file * f p) ;

int fgetc(file * f p) ;

int getchar(void);

成功則為下乙個字元,若已處檔案尾端或出錯則為eof. getc 為巨集,fgetc為函式

使用 ferror 或者feof 檢視讀結束狀態,clearerr 清除error. ugetc可以送回讀出來的字元。

7.字元寫

字元寫跟字元讀正好相反。

#include int putc(int c, file * fp) ;

int fputc(int c, file * fp);

int putchar(int c) ;

8. 行讀寫

#include char *fgets(char * buf, int n,file * fp) ;

char *gets(char * buf) ; //基本不建議用,防止buf溢位。

#include int fputs(const char * str, file * fp) ;

int puts(const char * str);

9. 二進位制讀寫

#include size_t fread(void * ptr, size_t size, size_t nobj, file * fp) ;

size_t fwrite(const void* ptr, size_t size, size_t nobj,file* fp); //缺點是異構系統上二進位制讀寫會產生問題。

二進位制讀寫的乙個簡單demo:

#include #include struct school

;int main()

fclose(fp);

file* fp2 = fopen("/tmp/bintest","r");

struct school su;

if(fread(&su, sizeof(struct school),1, fp2)!=1)

printf("number =%d,name=%s\n",su.number, su.name);

}

10. 定位檔案

#include long ftell(file * fp) ;

返回:若成功則為當前檔案位置指示,若出錯則為- 1 l

int fseek(file * fp,long offset,int whence) ;

返回:若成功則為0,若出錯則為非0

void rewind(file * fp) ; //使檔案重新回到頭

#include int fgetpos(file * fp, fpos_t * pos) ;

int fsetpos(file * fp, const fpos_t * pos) ;

11. 格式化io

經典的幾個格式化輸出函式

#include int printf(const char *format, ...);

int fprintf(file * fp, const char *format, ...);

int sprintf(char * buf, const char *format, ...);

int scanf(const char * format, ...);

int fscanf(file * fp, const char *format, ...);

int sscanf(const char * buf, const char *format, ...);

12. 臨時檔案

簡單demo:

#include #include #define maxline 1024

int main(int argc, char* argv)

fputs("put one line to file\n",fp);

rewind(fp);

if (fgets(line,sizeof(line),fp)==null)

fputs(line,stdout);

exit(0);

}~

APUE 再讀之程序關係

本章是最為難懂,最為晦澀的一章。主要講解程序組,session,終端,作業之間關係和概念。1.終端登入 終端登入由init自舉fork getty程序,getty 呼叫類似execle usr bin login login p username,char 0,envp 這樣的語句來完成登入過程。正...

linux標準IO緩衝(apue)

linux用緩衝的地方遍地可見,不管是硬體 核心還是應用程式,核心裡有頁高速緩衝,記憶體高速緩衝,硬體更不用說的l1,l2 cache 應用程式更是多的數不清,基本寫的好的軟體都有。但歸根結底這些緩衝的作用是相同的,都是為了提高機器或者程式的效能。而需要緩衝大部分的情況都是為了協調兩個裝置或者兩個系...

APUE筆記 第五章 標準I O庫

2.流和相關函式 3.格式化i o 4.fileno 函式 5.tmpnam 和tmpfile 函式 標準i o庫是在系統呼叫函式基礎上構造的。ansi c要求下列快取特徵 1 當且僅當標準輸入和標準輸出並不涉及互動作用裝置時,它們才是全快取的。2 標準出錯決不會是全快取的。1.1全快取 在這種情況...