本章介紹標準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全快取 在這種情況...