知識點整理----輸入/輸出函數

在c語言學習過程,不可避免地需要進行數據的輸入和輸出操作。c標準庫(stdio.h)也爲不同使用場景提供了許多函數。但是如果沒有整理學習,在後續需要查找的時候就會花費時間,因此在這裏爲自己做個整理記錄。
一、錯誤報告與終止執行
void perror( char const *message );
如果message爲非空字符串,則該函數將打印出此字符串,並在後面緊跟一個分號和一個空格,然後打印出一條用於解釋errno的當前錯誤代碼的信息。這裏需要注意,只有當一個庫函數失敗時,errno纔會被設置。當函數執行成功時,errno的值是不會被修改。這意味着不能通過測試errno的值來判斷是否有錯誤發生,反之,只有當被執行的函數提示有錯誤發生時檢查errno的值纔有意義。

void exit( int status );
status參數返回給操作系統,用於提示程序是否正常完成。其預定義可選值爲EXIT_SUCCESS和EXIT_FAILURE,分別提示程序的終止是成功還是失敗。

上述兩個函數常常是一起使用,在終止程序運行時,打印出錯誤的原因,方便後續定位排查。

二、流I/O總覽
流分爲兩種:文本流和二進制流。用FILE管理流。FILE是一種數據結構,用於管理緩衝區和存儲流的I/O狀態,每個被激活的流,都有一個相應的FILE與它相關聯。對於c標準,程序運行時至少提供三個流:標準輸入stdin、標準輸出stdout和標準錯誤stderr。另外還有兩個I/O常量,FOPEN_MAX:定義可以同時打開的最少文件數,至少爲8.FILENAME_MAX:定義編譯器所支持的最長合法文件名。
對於流的操作流程一般如下:
a 爲每個處於活動的文件聲明一個FILE指針變量。
b 通過調用fopen函數打開。要打開一個流,必須指定需要訪問的文件或者設備,以及它們的打開方式(讀、寫或者即讀又寫)。
c 根據需要進行處理,讀取或者寫入操作。
d 調用fclose函數關閉流,關閉一個流可以防止與它相關聯的文件被再次訪問,保證任何存儲於緩衝區的數據被正確寫到文件中,並且釋放FILE結構使它可以用於另外的文件。

三、I/O操作函數
(1)打開、關閉
FILE *fopen( char const *name, char const *mode );
其中的name爲所希望打開的文件或設備名字,而mode用於提示所打開的流的作用,是文本流還是二進制流,以及它們的讀寫權限。常用的模式有:
文本流:讀取(”r“),寫入(”w“),添加(”a“)
二進制流:讀取(”rb“),寫入(”wb“),添加(”ab“)
在程序中可以如下使用:

FILE *input;
input = fopen("data3", "r");
if (input == NULL)
{
    perror("data3");
    exit(EXIT_FAILURE);
}

對打開操作進行檢查是必要的,而perror可以讓程序員快速定位到出錯的地方,它可能的打印輸出的形式如下:
data3:No such file or directory

而打開或重新打開一個特定的文件流,可以用如下的函數:
FILE *freopen( char const *name, char const *mode, FILE *stream);
其中這裏的最後一個參數就是需要打開的流,它可能是一個從先前fopen函數返回的流,也可能是標準流stdin, stdout, stderr。這個函數首先試圖關閉這個流,然後用指定的文件和模式重新打開這個流。如果失敗返回NULL,否者返回它的第三個參數值。

int fclose( FILE *f );
用於關閉之前打開的流。
是否需要對fclose的返回值進行判斷呢,這個依據程序而定;如果這個操作的成功與否不影響程序接下來的操作,則可以不需要判斷返回值,否則就必須判斷。可以用如下形式判斷:

if ( fclose(input) != 0)
{
    perror("fclose");
    exit(EXIT_FAILURE);
} 

(2)字符操作
當一個流被打開後,它可以用於輸入或輸出。
字符輸入操作:
int fgetc( FILE *stream );
int getc( FILE *stream );
int getchar( void );
其中fgetc和getc可以從指定流中讀取字符,則getchar只能用於從標準輸入中讀取。返回值爲int類型的原因是爲了允許函數報告文件的末尾(EOF)。每個函數從流中讀取下一個字符,並把它作爲函數的返回值返回。

字符輸出操作:
int fputc( int character, FILE *stream );
int putc( int character, FILE *stream );
int putchar( void );
第一個參數就是要被打印的字符,在打印之前,函數把這個整形參數裁剪爲一個無符號字符型值。、

撤銷字符操作:
int ungetc( int character, FILE *stream );
它可以把一個先前讀入的字符返回到流中,這樣它可以在以後被重新讀入。

(3)行操作
(3-1)未格式化的行操作
(3-2)格式化的行操作

(4)二進制操作
(5)刷新與定位操作
(6)更改緩衝方式操作
(7)判斷流狀態
(8)文件刪除與重命令
(9)臨時文件的創建與命令

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章