步步LINUX C 基於流的I O操作

2021-06-05 20:58:30 字數 3810 閱讀 9933

前一篇步步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 ...