輸入 輸出函式

2021-06-26 21:31:04 字數 4045 閱讀 2632

perror函式以一種簡單、統一的方式報告錯誤資訊。

例如,如果乙個程式試圖從乙個並不存在的磁碟檔案讀取資料,作業系統除了提出發生了錯誤之外就沒有什麼好做的了。標準庫函式在乙個外部整形變數errno中保留錯誤**之後就把這個資訊傳遞給使用者程式,提示操作失敗的準確原因。

void perror(char const *message);

如果message不是null並且指向乙個非空的字串,perror函式就列印這個字串,後面跟乙個分號和乙個空格,然後列印一條用於解釋當前錯誤**的資訊。

終止執行

另乙個有用的函式是exit,它用於終止乙個程式的執行,它的原型定義於stdlib.h,如下所示:

void  exit (int status);

status引數返回給作業系統,用於提示程式是否正常完成。這個值和main函式返回的整型狀態相同,預定義符號exit_success和exit_failure分別提示程式的終止是成功還是失敗,雖然程式也可以使用其他的值,但是他們的具體含義將取決於編譯器。

用於輸出流的緩衝區只有當它寫滿時才會被重新整理(flush,物理寫入)到裝置或檔案中。一次性把寫滿的緩衝區寫入和逐片把程式產生的輸出分別寫入相比效率跟高。

儘管這種緩衝通常是我們所需要的,但當你除錯程式是仍然可能引起混淆,乙個廠家的除錯策略是把一些printf函式的呼叫散布於程式中,確定錯誤出現的具體位置,但是,這些函式呼叫的輸出結果被寫入到緩衝區中,並不立即顯示在螢幕上,事實上,如果程式失敗,緩衝輸出可能不會被實際寫入,這就可能使程式設計師得到關於錯誤出現位置的不正確結論,這個問題的解決方法就是在每個用於除錯的printf函式之後立即呼叫flush,如下所示:

printf("something or other");

fflush(stdout);

fflush函式迫使緩衝區的資料立即寫入,不管它是否已滿。

文字流流分為兩種型別,文字(text)流和二進位制(binary)流。文字流的有些特性在不同的系統中可能不同,其中值之一就是文字行的最大長度,標準規定至少允許254個字元。另外乙個可能不同的特性是文字行的結束方式。例如,在ms-dos系統中,文字檔案約定乙個會車和乙個換行符結尾,但是,unix系統只使用乙個換行符結尾。

二進位製流

另一方面,二進位製流中的位元組將完全根據程式編寫它們的形式寫入到檔案或裝置中,而且完全根據它們從檔案或裝置讀取的形式讀入到程式中,它們並為做任何改變。這種型別的流適用於非文字資料,但是如果你不希望i/o函式修改文字的行末字元也可以把它們用於文字檔案。

開啟檔案流

file  *fopen(char const *name, char const *mode);

讀取寫入

新增文字

'r'"w"

"a"二進位制

"rb"

"wb"

"ab"

mode以r,w,a開頭,分別表示開啟的流用於讀取,寫入,還是新增,如果乙個檔案開啟是用於讀取的,那麼它必須是原先已經存在的,但是,如果乙個檔案開啟是用於寫入的,如果它原先已經存在,那麼它原來的內容就會被刪除,如果它原先不存在,那麼就建立乙個新檔案,如果開啟乙個用於新增的檔案,原先並不存在,那麼它就將被建立,如果他原先已經存在,它原先的內容將不會被刪除,無論在哪一種情況下,資料只能從檔案的尾部寫入。

在mode中新增『a+』表示該檔案開啟用於更新並且流既允許讀也允許寫。但是,如果你已經從該檔案讀入了一寫資料,那麼在你開始向他寫入資料之前,你必須呼叫其中乙個檔案定位函式(fseek , fsetpos ,rewind)。在你向檔案寫入一些資料之後,如果你又想從檔案讀取一些資料,你首先必須呼叫fflush函式或者檔案定位函式之一。

為格式化的行i/o

char *fgets(char *buffer, int buffer_size,  file *stream);

char *fputs(char const *buffer, file *stream);

fgets從指定的stream讀取字元並把它們複製到buffer中。當它讀取乙個換行符並儲存到緩衝區之後就不再讀取。如果緩衝區內儲存的字元數達到buffer_size - 1個時它也停止讀取。在這種情況下,並不會出現資料丟失的情況,因為下一次呼叫fgets將從流的下乙個字元開始讀取。在任何一種情況下,乙個nul位元組將被新增到緩衝區所儲存資料的末尾,使它成為乙個字串。

如果在任何字元讀取就到達了檔案末尾,緩衝區就未進行修改,fgets函式返回乙個null 指標,否則,fget返回它的第乙個引數(指向緩衝區的位址)。

傳遞費fputs的緩衝區必須包含乙個字串,它的字元被寫入到流中,這個字串預期已nul位元組結尾,所以這個函式沒有乙個緩衝區長度引數。這個字串是逐字寫入的,如果它不包含乙個換行符,就不會寫入換行符,如果他包含了好幾個換行符,所有的換行符都會被寫入,因此,當fgets每次都讀取一整行時,fputs卻可以一次寫入一行的一部分,也可以一次寫入一整行,甚至可以一次寫入好幾行。如果寫入時出現了錯誤,fputs返回常量值eof,否則它將返回個非負值。

格式化的行i/o

scanf家族

int fscanf(file *stream, char const *format, .......);

int scanf(char const *foramat,....);

int sscanf(char const *string, char const *format, ........);

這些函式都是從輸入源讀取字元並根據format字串給出的格式**對它們進行轉換。fscanf的輸入源就是作為引數給出的流,scanf從標準輸入讀取,而sscanf則從第乙個引數所給出的字串中讀取字元。

當格式化字元到達末尾或者讀取的輸入不在匹配格式化字串指定的型別時,輸入就停止。在任何一種情況下,被轉換的輸入值的數目作為函式的返回值返回。如果在任何輸入值被轉換之前檔案就已經達到末尾,函式就返回常量值eof。

printf家族

int fprintf(file * stream, char const *foemat, .......);

int printf(char const *format, .....);

int sprintf(char *buffer, char const *format,....);

printf根據格式化**和format引數中的其他字元對引數列表中的值進行格式化。使用風printf,可以使用任何輸出流,而sprintf把它的結果作為乙個nul結尾的字串儲存到指定的buffer緩衝區而不是寫入到流中,這3個函式的返回值是實際列印或儲存的字元數。

long ftell(file *stream);

int fseek(file *stream, long offset, int from);

ftell函式返回流的當前位置,也就是說,下乙個讀取或寫入將要開始的位置距離檔案起始位置的偏移量,這個函式允許你儲存乙個檔案的當前位置。這樣你可能在將來會返回這個位置。在二進位製流中,這個值就是當前距離檔案起始位置之間的位元組數。

在文字流中這個值表示乙個位置,但它並不一定準確地表示當前位置和檔案起始位之間的字元數,因為有些系統將對行末進行翻譯轉換,但是,ftell函式但會的值總是可以用於fseek函式中,作為乙個距離檔案起始位置的偏移量。

fseek函式允許你在乙個流中定位。這個操作將改變下乙個讀取或寫入操作的位置,它的第乙個引數是需要改變的流,它的第二個和第三個引數標誌檔案中需要定位的位置,

fseek引數

如果from是……

你將定位到

seek_set

從流的起始位置起offset個位元組,offset必須是乙個非負數

seek_cur

從流的當前位置起offset個位元組,offset的值可正可負

seek_end

從流的尾部位置起offset個位元組,offset的值可正可負,如果它是正值,它將定位到檔案尾的後面

改變緩衝方式

int setvbuf(file *stream, char *buf, int mode, size_t size);

setvbuf函式,mode引數用於指定緩衝的型別。__iofef指定乙個完全緩衝的流,__ionbf指定乙個不緩衝的流,__iolbf 指定乙個行緩衝流。所謂行緩衝流,就是每當乙個換行符寫入到緩衝區時,緩衝區便進行重新整理。

buf和size引數用於指定須臾奧使用的緩衝區,如果buf為null,那麼size的值必須是0.

輸入 輸出函式

1.多型別輸入函式scanf 功能 從標準的輸入裝置讀取各種型別的資料並存放到相應的變數中 格式 scanf 格式控制 位址列表 例 scanf d a 注 輸入時要注意輸入格式 int d float f double lf char c char char s 注意 1 當格式控制部分中相鄰的兩...

輸入 輸出函式

文字 一 字元io 1.getchar putchar int getchar void int putchar int ch 從標準輸入得到乙個字元和從標準輸出 顯示器 顯示乙個字元 int c getchar putchar c 1.2 getc putc 返回值和getchar一樣,都是乙個字...

輸入輸出函式

getchar函式是接收從鍵盤輸入的單個字元資料。它是乙個無參函式,其語法格式為 getchar 使用該函式需要在程式前面包含標頭檔案cstdio 說明 通常把輸入的字元賦予乙個字元變數,構成賦值語句。例如 char ch ch getchar getchar 函式只能接受單個字元,輸入數字也按字元...