???? 標準IO庫是C語言提供的一個庫,不光存在于linux中,在windows中也是有的。標準IO庫和文件IO的不同是,標準IO庫是對文件IO(即系統調用)的封裝,并且在用戶層添加了一些緩沖區。
???? 文件IO的所有操作都是針對文件描述符進行的,而標準IO則使用文件指針。當打開或創建一個文件時,標準IO使得文件與一個流相結合。例如,用fopen打開一個文件,則返回一個FILE結構體的指針,所有的操作都是通過FILE指針進行的。FILE結構體中包含了文件的描述符,緩沖區的長度,指向緩沖區的指針以及文件的出錯標記等。unix環境高級編程第三版pdf。
???? 在文件IO一章中,說明了標準輸入輸出對應的三個文件的文件描述符分別是STDIN_FILENO,STDOUT_FILENO以及STDERR_FILENO,它們對應的文件指針分別是stdin,stdout,stderr。
???? 標準IO的緩存可以分為一下三種:
?全緩存:在全緩存的情況下,只有當在用戶區的緩存裝滿或者調用fflush函數時,才會將緩存中的內容寫入到內核,在通過內核寫入到文件中去。行緩存:在行緩存的情況下,只有當遇到一個換行符時,才會進行IO操作。不緩存:就是沒有緩存。
全緩存一般用于非交互式的文件存取中,例如讀一個制定的文本文件一般采用全緩存的方式。行緩存常用于終端的交互。c++筆記?例如,標準輸入和標準輸出就采用行緩存。不緩存的情況就是標準出錯了,在這中情況下,要求將出錯信息盡快的輸出,當然不能使用緩存了。
???? 可以使用setbuf和setvbuf來設置一個流的緩存,它們的函數原型如下:
int setbuf(FILE* fp,char* buf);int setvbuf(FILE* fp,char* buf,int mode,size_t size);
如果函數執行成功返回0,否則返回非0。setbuf第一個參數為文件指針,第二個參數buf必須指向一個長度為BUFSIZ的緩沖區,BUFSIZ在stdio.h頭文件中定義。如果buf為NULL,則為不帶緩存。setvbuf第一個參數為文件指針,第二個參數為緩沖區的指針,第三個參數指定緩存的方式,第四個參數指定緩存的長度。數據結構讀書筆記5000。mode可選擇的有一下類型:
_IOFBF全緩存
_IOLBF行緩存
_IONBF無緩存
如果該流是帶緩存的,即mode的值不是_IONBF,但是buf的值為NULL,則系統自動為該流分配緩存。如果mode為_IONBF,則忽略buf和size的值。設置緩存的工作一定要在流還沒有進行任何的操作之前進行,否則第一次對劉德操作將導致緩存的自動分配。一般來說,緩存的分配應該有系統自動進行,這樣就可以在關閉流的時候,自動釋放分配的緩存。
我們可以使用fflush強制刷新一個緩存,它的函數原型如下:
int fflush(FILE* fp);
???? 在linux中,刷新有兩個意思,
(1)強制將緩存中的數據寫入到磁盤上,即使緩存沒有寫滿
(2)強制將緩存中的數據丟棄
在這里fflush當然是第一種操作。
???? 打開流的操作有三個函數:
FILE* fopen(const char* filename,const char* type);
FILE* freopen(const char* pathname,const char* type,FILE* fp);
FILE* fdopen(int filedes,const char* type);
如果函數執行成功,則返回文件指針,否則返回空指針NULL。redis筆記?type用來指定文件的打開方式,它的選擇有r,w,a,rb,wb,ab,r+,w+,a+。第二個函數是在一個特定的流上打開一個文件,如果該流已經打開,則先將該流關閉。此函數一般用于將指定的文件打開為一個預定義的流,如標準輸入,標準輸出和標準出錯。在使用fopen函數創建一個文件時,沒有辦法指定新建文件的權限。在linux系統中規定,新建的文件的權限為S_IRUSR| S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH。
???? 使用fclose函數關閉一個流,它的函數原型如下:intfclose(FILE*fp);當關閉一個流時,會自動刷新輸出緩存中的數據,丟棄輸入緩存中的數據。unix。如果緩存是自動分配的,則會自動釋放緩存。
???? 一次從文件中讀取一個字符的函數有getc,fgetc和getchar。getc和fgetc的功能是相同的,只不過getc是用宏來實現的,fgetc使用函數來實現的。所以說,getc的效率要比fgetc的效率高一些。而個getchar直接是從標準輸入讀取字符的。這三個函數的函數原型如下:
int getc(FILE* fp);
int fgetc(FILE* fp);
int getchar(void);
與之對應的三個輸出函數分別是:
int putc(int c,FILE* fp);
int fputc(int c,FILE* fp);
int putchar(int c);
putchar直接輸出到標準輸出。Java筆記?ungetc可以將讀出的字符重新送回到流中:
int ungetc(int c,FILE* fp);
???? 可以使用ferror和feof來檢測在操作流的過程中是碰到了文件的末尾,還是發生了錯誤。可以使用clearerr函數來清除FILE中的error和eof標志。
???? 每次輸入一行的IO操作有,gets和fgets,它們的函數原型如下:
char* gets(char* buf);
char* fgets(char* buf,int n,FILE* fp);
gets函數直接從標準輸入接收字符串,緩沖區buf的長度由stdio.h文件中的BUFFSIZ指定,用戶不能指定緩沖區的大小。所以,當輸入的字符足夠長,就會越出buf的緩沖區,從而造成不可預測的后果,這個漏洞就曾經被人利用,造成1988年的因特網蠕蟲病毒事件。所以gets函數是不建議使用的。與這兩個函數相對應的輸出函數是puts和fputs:
int puts(const char* str);
int fputs(const char* str,FILE* fp);
puts將指定的字符串輸出到標準輸出,并且輸出一個換行符。unix高級編程技術,fread和fwrite函數用來對二進制文件進行操作,它一般用來向文件中寫入(或從文件中讀出)若干數目的結構體。
???? 對流的定位可以使用ftell和fseek以及fgetpos和fsetpos。格式化輸出函數有三個:printf,fprintf和sprintf,對應的格式化輸入函數有scanf,fscanf以及sscanf。在標準io庫中提供了兩個用于創建臨時文件的函數tmpnam和tmpfile。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态