前一篇步步linux c系列文章介紹了檔案i/o操作
這篇文章進一步介紹linux系統中的另一種輸入輸出方法。相對來說,流式i/o由於其簡單以及方便性,應用範圍更為廣泛。
概念與操作流程:
流,類似於無儲存不可見的檔案。其中包含有特定結構體,結構體裡面是管理該流的所有資訊,如關聯檔案描述符,快取長度,快取中字元數,出錯標誌等。乙個例子是stdin->_flags表示快取區的型別。
每乙個檔案都與乙個流相結合,我們使用fopen函式開啟流(有三個流是自動開啟的:標準輸入,標準輸出,標準出錯),返回乙個file結構指標。流成功開啟後,就可以使用標準i/o函式對其進行操作。操作完成後,需清空緩衝區,儲存資料,並且關閉流。
首先,我們還是列出引數列表:
標準流(標頭檔案:unistd.h)
標準輸入
stdin
標準輸出
stdout
標準出錯
stderr
mode引數(標頭檔案:stdio.h) 型別
定義的巨集
全快取_io_full_buf
行快取_io_line_buf
無快取_io_unbuffered
mode引數(標頭檔案:stdio.h) 值
型別新建
清空可讀
可寫位置
r文字檔案nn
yn檔案頭r+
文字檔案yn
yy檔案頭w
文字檔案yy
ny檔案頭w+
文字檔案yy
yy檔案頭a
文字檔案yy
ny檔案尾a+
文字檔案yy
yy檔案尾rb
二進位制文字nn
yn檔案頭rb+
二進位制文字yn
yy檔案頭wb
二進位制文字yy
ny檔案頭wb+
二進位制文字yy
yy檔案頭ab
二進位制文字yy
ny檔案尾ab+
二進位制文字yy
yy檔案尾下面是基於流i/o操作的函式以及功能的簡單描述:
快取操作函式
屬性設定
#include void setbuf(file *steam, char *buf);
void setbuffer(file *steam, char *buf, size_t size);
void setlinebuf(file *steam);
int setvbuf(file *steam, char *buf, int mode, size_t size);
前三個函式適用於老系統,其功能都可以用最後乙個函式取代。它成功後返回0;出錯返回-1。
用於設定快取的型別,大小。
清空快取
#include int fflush(file *fp);
#include void fpurge(file *fp);
fflush函式用於將快取區資料強行儲存後清空。成功後返回0;出錯返回eof。
fpurge函式用於直接清空快取區,較少使用。
流開關函式
開啟流
#include file * fopen(const char * filename, const char * mode);
file * freopen(const char * filename, const char * mode, file *fp);
file * fdopen(int fd, const char * mode);
成功後返回流;出錯返回null。
freopen函式用於在特定流上開啟乙個檔案,fdopen函式是現有檔案描述符與乙個標準io流結合。
關閉流
#include int fclose ( file * stream );
成功後返回0;出錯返回eof。
關閉流前會將緩衝區的資料寫入流,避免了資料丟失,所以fclose函式是必要的。
流讀寫函式
基於字元的i/o
#include int getc ( file * stream );
int fgetc ( file * stream );
int getchar ();
成功後返回讀到的字元;出錯返回eof。
getc可被實現為巨集,fgetc不能。getchar函式從stdin讀入字元。
include int putc ( int character, file * stream );
int fputc ( int character, file * stream );
int putchar ( int character );
成功後返回讀到的字元;出錯返回eof。
putc可被實現為巨集,fputc不能。outchar函式從stdout讀入字元。
基於行的i/o
#include char * fgets ( char * str, int num, file * stream );
char * gets ( char * str );
成功後返回字串首地質;出錯返回null。
gets由於沒有給定行字串的長度,因而十分危險。
#include int fputs ( cosnt char * str, file * stream );
int puts ( const char * str );
成功後返回乙個非零值;出錯返回eof。
直接i/o
#include size_t fread ( void * ptr, size_t size, size_t count, file * stream );
size_t fwrite ( const void * ptr, size_t size, size_t count, file * stream );
成功返回讀寫到的元素個數;出錯返回不等於count的數。
兩個size_t型別,前者是每個讀寫元素的位元組數,後者是元素個數。
格式化i/o
#include int printf ( const char * format, ... );
int fprintf ( file * stream, const char * format, ... );
int sprintf ( char * str, const char * format, ... );
int snprintf ( char * str, size_t size, const char * format, ... );
成功後返回輸出的字元數;出錯返回乙個負數值。
fprintf用於向乙個流輸出資料,sprintf用於向乙個字元陣列輸出資料。
#include int scanf ( const char * format, ... );
int fscanf ( file * stream, const char * format, ... );
int sscanf ( const char * str, const char * format, ...);
成功後返回輸入的字元數;出錯返回eof。
fscanf用於從乙個流讀入資料,sscanf用於從乙個字元陣列讀入資料。
(完)
基於流的I O操作
一 對快取的操作 include void setbuf file fp,char buf void setbuffer file fp,char buf,size t size void setlinebuf file fp int setvbuf file fp,char buf,int mod...
基於流的I O 流與緩衝
基於流的操作最終都會呼叫read或write進行操作。即流的內部封裝了這兩個系統呼叫。緩衝分如下三種 全緩衝 相應巨集 io full buf 直到緩衝區被填滿,菜呼叫系統i o函式。磁碟檔案讀寫通常是全緩衝的。行緩衝 相應巨集 io line buf 直到遇到換行符 n 才呼叫系統i o函式。標準...
IO流5 IO流 緩衝流的使用
bufferedinputstream bufferedoutputstream bufferedreader bufferedwriter 提供流的讀取 寫入的速度 提高讀寫速度的原因 內部提供了緩衝區 實現非文字檔案的複製 test public void testbufferedstream ...