C和指針_第15章_輸入輸出函數(shù)_學(xué)習(xí)筆記
1.錯(cuò)誤報(bào)告
? ? perror函數(shù)一種簡(jiǎn)單、統(tǒng)一的方式報(bào)告錯(cuò)誤。標(biāo)準(zhǔn)庫(kù)函數(shù)在一個(gè)外部整型變量errno(在errno.h中定義)中保存錯(cuò)誤代碼之后把這個(gè)信息傳遞給用戶程序,提示操作失敗的準(zhǔn)確原因。perror函數(shù)簡(jiǎn)化向用戶報(bào)告這些特定錯(cuò)誤的過(guò)程。定義于stdio.h中:
void?perror(?char?const?*message?);
? ? 如果message不是NULL并且指向一個(gè)非空的字符串,perror函數(shù)將打印這個(gè)字符串,后面跟一個(gè)分號(hào)和一個(gè)空格,然后打印出一條用于解釋errno當(dāng)前錯(cuò)誤代碼的信息。
? ? 注意,只有當(dāng)一個(gè)庫(kù)函數(shù)失敗時(shí),errno才會(huì)被設(shè)置。當(dāng)函數(shù)成功運(yùn)行時(shí),errno的值不會(huì)被修改。這意味著我們不能通過(guò)測(cè)試errno的值來(lái)判斷是否有錯(cuò)誤發(fā)生。反之,只有當(dāng)被調(diào)用函數(shù)提示有錯(cuò)誤發(fā)生時(shí)檢查errno的值才有意義。
?
2.終止執(zhí)行
void?exit(?int?status?);
? ? status參數(shù)返回給操作系統(tǒng),提示程序是否正常完成。預(yù)定義符號(hào)EXIT_SUCCESS和EXIT_FAILURE分別提示程序的終止是成功還是失敗。經(jīng)常會(huì)出現(xiàn)的是在調(diào)用perror函數(shù)之后再調(diào)用exit終止程序。
?
4.ANSI I/O概念
? ? stdio.h包含F(xiàn)ILE結(jié)構(gòu)的聲明,F(xiàn)ILE是一個(gè)數(shù)據(jù)結(jié)構(gòu),用于訪問(wèn)一個(gè)流。編譯器保證一個(gè)程序同時(shí)最多可以打開(kāi)文件的數(shù)量至少為FOPEN_MAX。這個(gè)常量包括了三個(gè)標(biāo)準(zhǔn)流,它的值至少為8。
?
5.流總覽
?
字符 getcharputchar 讀取(寫(xiě)入)單個(gè)字符 文本行
gets
scanf
puts
printf
文本行未格式化的輸入(輸出)
格式化的輸入(輸出)
二進(jìn)制數(shù)據(jù) fread fwrite 讀取(寫(xiě)入)二進(jìn)制數(shù)據(jù)
????斜體為函數(shù)家族,指一組函數(shù)中的每個(gè)都執(zhí)行相同的基本任務(wù),只是方式稍有不同。這些函數(shù)的區(qū)別在于獲得輸入的來(lái)源或輸出寫(xiě)入的地方不同。這些變種用于執(zhí)行下面任務(wù):
? ? 1.只用于stdin或stdout
? ? 2.隨作為參數(shù)的流使用
? ? 3.使用內(nèi)存中的字符串而不是流
?
getchar 字符輸入 fgets,getc getchar ① putchar 字符輸出 fputc,putc putchar ① gets 文本行輸入 fgets gets ② puts 文本行輸出 fputs puts ② scanf 格式化輸入 fscanf scanf sscanf printf 格式化輸出 fprintf printf sprintf
? ? ①對(duì)指針使用下標(biāo)引用或間接訪問(wèn)操作從內(nèi)存中獲得一個(gè)字符(或向內(nèi)存寫(xiě)入一個(gè)字符)。
????②使用strcpy函數(shù)從內(nèi)存中讀取文本行(或向內(nèi)存中寫(xiě)入文本行)
?
6.打開(kāi)流
FILE?*fopen(?char?const?*name,?char?const?*mode?);
? ? 應(yīng)該始終檢查fopen函數(shù)的返回值。
FILE?*fptr; fptr?=?fopen(?"data_name",?"r"?); if(?fptr?==?NULL?) { ????perror("data_name"); ????exit(EXIT_FAILURE); }
? ? freopen函數(shù)用于打開(kāi)(重新打開(kāi))一個(gè)特定的文件流。原型如下:
FILE?*freopen(?char?const?*name,?char?const?*mode,?FILE?*stream?);
? ? 最后一個(gè)參數(shù)就是需要打開(kāi)的流。它可能是一個(gè)先前從fopen函數(shù)返回的流,也可能是標(biāo)準(zhǔn)流。這個(gè)函數(shù)首先試圖關(guān)閉這個(gè)流,然后用指定的文件和模式重新打開(kāi)這個(gè)流。如果打開(kāi)失敗,返回NULL。如果打開(kāi)成功,函數(shù)返回其第3個(gè)參數(shù)。
?
7.關(guān)閉流
? ? 流是使用函數(shù)fclose關(guān)閉的,關(guān)閉前會(huì)刷新緩沖區(qū)。如果只選成功,返回0,否則返回EOF。函數(shù)原型如下:
int?fclose(?FILE?*stream?);
? ? 只要操作成功后和操作失敗后的執(zhí)行指令不一樣,就應(yīng)該進(jìn)行錯(cuò)誤檢查。
#include#includeint?main(?int?argc,?char?**argv) { int?exit_status?=?EXIT_SUCCESS; FILE?*input; //when?the?file?not?only?one while(*++argv?!=?NULL?) { //open?the?file input?=?fopent(?*argv,?"r"?); if(?input?==?NULL?) { perror(?*argv?); exit_status?=?EXIT_FAILURE; continue; } //deal?with?the?opened?file //close?the?file if(?fclose(?input?)?!=?0) { perror(?"fclcose"?); exit(?EXIT_FAILURE?); } } return?EXIT_SUCCESS; }
?
8.字符I/O??
int?fgetc(?FILE?*stream?); int?getc(?FILE?*stream?); int?getchar(?void?);
? ? getc和fgetc是從傳入的操作流中讀取,而getchar從標(biāo)準(zhǔn)輸入流中讀取。每個(gè)函數(shù)從流中讀取下一個(gè)字符,并把它作為函數(shù)的返回值返回。如果流中不存在更多字符,函數(shù)返回常量值EOF。返回int值的真正原因是為了運(yùn)行函數(shù)報(bào)告文件的末尾(EOF),如果返回值為char,則256個(gè)字符中一定有一個(gè)被指定為EOF,導(dǎo)致如果文件中出現(xiàn)這個(gè)字符,字符后的內(nèi)容不會(huì)被讀取。
int?fputc(?int?character,?FILE?*stream?); int?putc(?int?character,?FILE?*stream?); int?putchar(?int?character?);
? ? fgetc和fputc是真正的函數(shù),但getc、putc、getchar和putchar都是通過(guò)#define指令定義的宏。
8.2撤銷(xiāo)字符I/O??
int?ungetc(?int?character,?FILE?*stream?);
? ? ungetc把一個(gè)先前讀入的字符返回到流中,使其在以后可以被重新讀入。每個(gè)流都允許至少一個(gè)字符被退回。如果一個(gè)流允許退回多個(gè)字符,那么這些字符再次被讀取的順序就以退回時(shí)的反序進(jìn)行。注意把字符退回到流中和寫(xiě)入到流中并不相同。與一個(gè)流相關(guān)聯(lián)的外部存儲(chǔ)并不受ungetc的影響。
? ? 警告:“退回”字符和流的當(dāng)前位置有關(guān),如果用fseek、fsetpos或rewind函數(shù)改變了流的位置,所有退回的字符將被丟棄。
?
9.未格式化的行I/O
? ? 未格式化的行I/O簡(jiǎn)單讀取或?qū)懭胱址?/p>
char?*fgets(?char?*buffer,?int?buffer_size,?FILE?*stream?); char?*gets(?char?*buffer?);
? ? fgets從指定的stream流中讀取字符并把它們復(fù)制到buffer(至少2個(gè)字節(jié),因?yàn)樽詈笠粋€(gè)需要用來(lái)放NUL)中。當(dāng)他讀到一個(gè)換行符并存儲(chǔ)到緩沖區(qū)中后不再讀取。如果緩沖區(qū)內(nèi)存儲(chǔ)的字符數(shù)達(dá)到buffer_size - 1個(gè)時(shí)也停止讀取。下一次調(diào)用fgets將從流的下一個(gè)字符開(kāi)始讀取。在任何一種情況下,一個(gè)NUL字節(jié)將被添加到緩沖區(qū)所存儲(chǔ)的數(shù)據(jù)的末尾,使其成為一個(gè)字符串。
? ? 如果在任何字符讀取前就到達(dá)了文件尾,緩沖區(qū)就未進(jìn)行修改,fgets函數(shù)返回一個(gè)NULL指針。否則,fgets就返回它的第一個(gè)參數(shù)(指向緩沖區(qū)的指針)。返回值通常只用于檢查是否到達(dá)了文件尾。
? ? gets和fgets主要不同在于讀取一行輸入時(shí),并不在緩沖區(qū)中存儲(chǔ)結(jié)尾的換行符。由于gets沒(méi)有緩沖區(qū)參數(shù),所以無(wú)法判斷緩沖區(qū)長(zhǎng)度。有可能緩沖區(qū)溢出。
?
int?fputs(?char?const?*buffer,?FILE?*stream?); int?puts(?char?const?*buffer?);
? ? 傳遞給fputs的緩沖區(qū)必須包含一個(gè)字符串,它的字符被寫(xiě)入到流中。這個(gè)字符串預(yù)期以NUL字節(jié)結(jié)尾,這個(gè)字符串是逐字寫(xiě)入。寫(xiě)入出現(xiàn)錯(cuò)誤時(shí),fputs返回常量值EOF,否則返回一個(gè)非負(fù)值。
? ? puts與fputs的主要不同在于寫(xiě)入一個(gè)字符串時(shí),在字符串寫(xiě)入之后向輸出再添加一個(gè)換行符。
#include#define?MAX_LINE_LENGTH?1024 void?copylines(?FILE?*input,?FILE?*output?) { char?buffer[MAX_LINE_LENGTH]; while(?(fgets(?buffer,?MAX_LINE_LENGTH,?input?)?!=?EOF?)?) fputs(?buffer,?output?); }
?
10.格式化的行I/O
????格式化的行I/O會(huì)執(zhí)行數(shù)字和其他變量的內(nèi)部和外部表示形式之間的轉(zhuǎn)換。
10.1 scanf函數(shù)家族
int?fscanf(?FILE?*stream,?char?const?*format,?...); int?scanf(?char?const?*format,?...); int?sscanf(?char?const?*string,?char?const?*format,?...);
? ? 原型中的省略號(hào)表示一個(gè)可變長(zhǎng)度的指針列表。從輸入源讀取字符并根據(jù)format字符串給出的格式代碼對(duì)其進(jìn)行轉(zhuǎn)換,將從輸入轉(zhuǎn)換而來(lái)的值逐個(gè)存儲(chǔ)到這些指針參數(shù)所指向的內(nèi)存位置。
? ? 當(dāng)格式化字符串到達(dá)末尾或者讀取的輸入不在匹配格式字符串所指定的類(lèi)型時(shí),輸入停止。被轉(zhuǎn)換的參數(shù)數(shù)目作為函數(shù)的返回值返回。如果在任何輸入值被轉(zhuǎn)換前 文件就達(dá)到尾部,返回常量EOF。
? ? scanf函數(shù)家族中的format字符串參數(shù)可能包含的內(nèi)容有:
空白字符——與輸入中的0個(gè)或多個(gè)空白字符匹配,在處理過(guò)程中被忽略。 格式代碼——指定函數(shù)如何解釋接下來(lái)的輸入字符 其他字符——任何其他字符出現(xiàn)在格式字符串時(shí),下一個(gè)輸入字符必須和它匹配。匹配后將被丟棄,不匹配函數(shù)不再讀取直接返回。
? ? scanf函數(shù)家族的格式代碼都以一個(gè)%開(kāi)頭,后面可以是:
一個(gè)可選的星號(hào)——星號(hào)將使轉(zhuǎn)換后的值丟棄而不是存儲(chǔ)。 一個(gè)可選的寬度——寬度以一個(gè)非負(fù)的整數(shù)給出,限制將被讀取用于轉(zhuǎn)換的輸入字符的個(gè)數(shù)。如果未給出寬度,函數(shù)就連續(xù)讀入字符直到遇見(jiàn)輸入中的下一個(gè)空白字符。 一個(gè)可選的限定符 d,i,n short long ? o,u,x unsigned short unsigned long ? e,f,g ? double long double
? ? 4.格式代碼
?
c char *
讀取和存儲(chǔ)單個(gè)字符。前導(dǎo)的空白字符并不跳過(guò)。如果給出寬度,就讀取和存儲(chǔ)這個(gè)數(shù)目
的字符。字符后面不會(huì)再添加一個(gè)NUL字節(jié)。參數(shù)必須指向一個(gè)足夠大的字符數(shù)組
i
d
int *
一個(gè)可選的有符號(hào)整數(shù)被轉(zhuǎn)換。d把輸入解釋為10進(jìn)制數(shù);i根據(jù)它的第1個(gè)字符決定值的
基數(shù),就像整型字面值常量的表達(dá)式一樣。
u
o
x
unsigned *
一個(gè)可選的有符號(hào)整數(shù)被轉(zhuǎn)換,但它按照無(wú)符號(hào)數(shù)存儲(chǔ)。如果使用u,值被解釋為十進(jìn)制
數(shù),如果使用0,值被解釋為八進(jìn)制數(shù);如果使用x,值被解釋為十六進(jìn)制數(shù)。X與x同義
e
f
g
float *
期待一個(gè)浮點(diǎn)值。它的形式必須像一個(gè)浮點(diǎn)型字面值常量,但小數(shù)點(diǎn)并非必需。E和G分
別與e和g同義
s char *
讀取一串非空白字符。參數(shù)必須指向一個(gè)足夠大的字符數(shù)組。當(dāng)發(fā)現(xiàn)空白輸入時(shí)就停止,
字符串后面會(huì)自動(dòng)加上NUL終止符
[xxx] char *
根據(jù)給定組合的字符從輸入中讀取一串字符。參數(shù)必須指向一個(gè)足夠大的字符數(shù)組。當(dāng)遇
到第1個(gè)不在給定組合中出現(xiàn)的字符時(shí),輸入就停止。字符串后面會(huì)自動(dòng)加上NUL終止符。
代碼%[abc]表示字符組包括a、b和c。如果列表中以一個(gè)^字符開(kāi)頭,表示字符組合是所
列出的字符的補(bǔ)集,所以%[^abc]表示字符組為a、b、c之外的所有字符。右方括號(hào)也可以
出現(xiàn)在字符列表中,但它必須是列表的第1個(gè)字符。至于橫桿是否用來(lái)指定某個(gè)范圍的字符
(例如%[a-z]),則因編譯器而異
p void *
輸入預(yù)期為一串字符,諸如那些由printf函數(shù)的%p格式代碼所產(chǎn)生的輸出。它的轉(zhuǎn)換方式
因編譯器而異,但轉(zhuǎn)換結(jié)果將和按照上面描述的進(jìn)行打印所產(chǎn)生的字符的值是相同的
n int *
d到目前為止通過(guò)這個(gè)scanf函數(shù)的調(diào)用從輸入讀取的字符數(shù)被返回。%n轉(zhuǎn)換的字符并不計(jì)
算在scanf函數(shù)的返回值之內(nèi)。它本身并不消耗任何輸入。
% ? 這個(gè)代碼與輸入中的一個(gè)%相匹配,該%符號(hào)將被丟棄。
? ? fscanf中將換行符也當(dāng)做空白字符跳過(guò),所以在使用fscanf時(shí),在輸入中保持行邊界的同步有困難。
?
10.3printf家族
int?fprintf(?FILE?*stream,?char?const?*format,?...?); int?printf(?char?const?*format,?...?); int?sprintf(?char?*buffer,?char?const?*format,?...?);
? ? sprintf把它的結(jié)果作為一個(gè)NUL結(jié)尾的字符串存儲(chǔ)到指定的buffer緩沖區(qū),注意,緩沖區(qū)的大小不是sprintf的參數(shù),所以易出現(xiàn)內(nèi)存塊越位,可以通過(guò)對(duì)格式進(jìn)行分析,看看最大可能出現(xiàn)的值被轉(zhuǎn)換后的輸出結(jié)果將由多長(zhǎng)來(lái)防止越位。格式代碼以一個(gè)%開(kāi)頭,后面:
?
零個(gè)或多個(gè)標(biāo)志字符,用于修改有些轉(zhuǎn)換的執(zhí)行方式 一個(gè)可選的最小字段寬度 一個(gè)可選的精度 一個(gè)可選的修改符 轉(zhuǎn)換類(lèi)型
?
c int 參數(shù)被裁剪為unsigned char類(lèi)型并作為字符進(jìn)行打印
d
i
int 參數(shù)作為一個(gè)十進(jìn)制數(shù)打印。如果給出精度而且值的位數(shù)小于精度位數(shù),前面就用0填充
u
o
x,X
int 參數(shù)作為一個(gè)無(wú)符號(hào)值打印,u使用十進(jìn)制,0使用八進(jìn)制,x或X使用十六進(jìn)制,兩者區(qū)別在于x使用abcdef,X使用ABCDEF
e
E
double 參數(shù)根據(jù)指數(shù)形式打印。小數(shù)點(diǎn)后面的位數(shù)由精度字段決定,默認(rèn)是6 f double 參數(shù)按照常規(guī)的浮點(diǎn)格式打印。小數(shù)點(diǎn)后面的位數(shù)由精度字段決定,默認(rèn)是6
g
G
double 如果指數(shù)≥-4但小于進(jìn)度字段就用%f,否則使用指數(shù)格式 s char * 打印一個(gè)字符串 p void * 指針值被轉(zhuǎn)換為一串因編譯器而異的可打印字符。這個(gè)代碼主要和scanf中的%p代碼組合使用 n int * 獨(dú)特代碼,不產(chǎn)生任何輸出。相反,到目前為止函數(shù)所產(chǎn)生的輸出字符數(shù)目將被保存到對(duì)應(yīng)的參數(shù)中 % (無(wú))
打印一個(gè)%字符
- 值在字段中左對(duì)齊。默認(rèn)情況是右對(duì)齊 0
d當(dāng)數(shù)值是右對(duì)齊時(shí),默認(rèn)情況下是使用空格填充值左邊未使用的列,這個(gè)標(biāo)志表示用0填充。它可用于
d,i,u,o,x,X,e,E,f,g和G代碼。使用d,i,o,u,x和X代碼時(shí),如果給出精度,零標(biāo)志就被忽略。如果格式代碼
中出現(xiàn)負(fù)號(hào)(-),零標(biāo)志也沒(méi)有效果
+
當(dāng)用于一個(gè)格式化某個(gè)符號(hào)值的代碼時(shí),如果值非負(fù),正號(hào)標(biāo)志就會(huì)給它加上一個(gè)正號(hào)。如果該值為負(fù),就像
往常一樣顯示一個(gè)負(fù)號(hào)。默認(rèn)情況下,正號(hào)并不會(huì)顯示
空格
只用于轉(zhuǎn)換有符號(hào)值的代碼。當(dāng)值非負(fù)時(shí),這個(gè)標(biāo)志把一個(gè)空格添加到它的開(kāi)始位置。注意這個(gè)標(biāo)志和正號(hào)標(biāo)志
是相互排斥的。如果兩個(gè)同時(shí)給出,空格標(biāo)志將被忽略
# 選擇某些代碼的另一種轉(zhuǎn)換形式。
11.二進(jìn)制I/O
? ? 把數(shù)據(jù)寫(xiě)到文件效率最高的方法就是用二進(jìn)制寫(xiě)入。
size_t?fread(?void?*buffer,?size_t?size,?size_t?count,?FILE?*stream?); size_t?fwrite(?void?*buffer,size_t?size,?size_t?count,?FILE?*stream?);
? ? buffer是一個(gè)指向保存數(shù)據(jù)的內(nèi)存位置的指針,size是緩沖區(qū)每個(gè)元素的字節(jié)數(shù),count是讀取或?qū)懭氲脑財(cái)?shù)。函數(shù)返回值是實(shí)際寫(xiě)入或讀取的元素?cái)?shù)目。
?
12.刷新和定位函數(shù)
int?fflush(?FILE?*stream?);
? ? fflush迫使一個(gè)輸出流的緩沖區(qū)內(nèi)的數(shù)據(jù)進(jìn)行物理寫(xiě)入,不管緩沖區(qū)是否被寫(xiě)滿。例如,為保證調(diào)試信息實(shí)際打印出來(lái),使用fflush。
long?ftell(?FILE?*stream?); int?fseek(?FILE?*stream,?long?offset,?int?from);
? ? from可以是SEEK_SET、SEEK_CUR和SEEK_END。在二進(jìn)制流中,從SEEK_END進(jìn)行定位可能不被支持。在文本流中,如果from是SEEK_CUR或SEEK_END,offset必須是0.如果from是SEEK_SET,offset必須是一個(gè)從同一個(gè)流中以前調(diào)用ftell返回的值。
?
SEEK_SET 從流的起始位置起offset個(gè)字節(jié),offset必須是一個(gè)非負(fù)值。 SEEK_CUR 從流的當(dāng)前位置起offset個(gè)字節(jié),offset的值可正可負(fù) SEEK_END 從流的尾部位置起offset個(gè)字節(jié),offset的值可正可負(fù),如果為正,將定位到文件尾的后面
? ? 之所以存在這些限制,部分原因是文本流所執(zhí)行的行末字符映射。由于這個(gè)映射的存在,文本文件的字節(jié)數(shù)可能和程序?qū)懭氲淖止?jié)數(shù)不同。因此,一個(gè)可移植的程序不能根據(jù)實(shí)際寫(xiě)入字符數(shù)的計(jì)算結(jié)果定位到文本流的一個(gè)位置。
? ? 用fseek改變一個(gè)流的位置會(huì)帶來(lái)三個(gè)副作用:
?
行末指示符被清除 如果在fseek之前使用ungetc把一個(gè)字符返回到流中,那么這個(gè)被退回的字符會(huì)被丟棄,因?yàn)樵诙ㄎ徊僮骱?,它不再是“下一個(gè)字符” 定位允許從寫(xiě)入模式切換到讀取模式,或者回到打開(kāi)的流以便更新。
void?rewind(?FILE?*stream?); int?fgetpos(?FILE?*stream,?fpos_t?*position?); int?fsetpos(?FILE?*stream,?fpos_t?*position?);
? ? rewind函數(shù)將讀/寫(xiě)指針設(shè)置回指定流的起始位置,同時(shí)清除流的錯(cuò)誤提示標(biāo)志。
?
13.改變緩沖方式
? ? 在流上執(zhí)行的緩沖方式有時(shí)并不合適,下面兩個(gè)函數(shù)可以用于對(duì)緩沖方式進(jìn)行修改。這兩個(gè)函數(shù)只有當(dāng)指定的流被打開(kāi)但還沒(méi)有在它上面執(zhí)行任何操作前才能被調(diào)用。
void?setbuf(?FILE?*stream,?char?*buf?); int?setvbuf(?FILE?*stream,?char?*buf,?int?mode,?size_t?size?);
? ? setbuf設(shè)置了另一個(gè)數(shù)組,用于對(duì)流進(jìn)行緩沖。這個(gè)數(shù)組的字符長(zhǎng)度必須是BUFSIZ(定義于stdio.h)。為一個(gè)流自行指定緩沖區(qū)可以防止I/O函數(shù)庫(kù)為它動(dòng)態(tài)分配一個(gè)緩沖區(qū)。如果用一個(gè)NULL參數(shù)調(diào)用該函數(shù),setbuf將關(guān)閉流的所有緩沖方式,字符準(zhǔn)確地將程序所規(guī)劃的方式進(jìn)行讀取和寫(xiě)入。
? ? setvbuf函數(shù)中,mode參數(shù)用于指定緩沖的類(lèi)型。_IOFBF指定一個(gè)完全緩沖的流,_IONBF指定一個(gè)不緩沖的流,_IOLBF指定一個(gè)行緩沖的流。所謂行緩沖,就是每當(dāng)一個(gè)換行符寫(xiě)入到緩沖區(qū),緩沖區(qū)就進(jìn)行刷新。
?
14.流錯(cuò)誤函數(shù)
int?feof(?FILE?*stream?); int?ferror(?FILE?*stream?); void?clearerr(?FILE?*stream?);
? ? 如果流當(dāng)前處于文件尾,feof函數(shù)返回真。這個(gè)狀態(tài)可以通過(guò)對(duì)流執(zhí)行fseek、rewind或fsetpos函數(shù)來(lái)清除。ferror函數(shù)報(bào)告流的錯(cuò)誤狀態(tài),如果出現(xiàn)任何讀/寫(xiě)錯(cuò)誤函數(shù)就返回真。最后,clearerr函數(shù)對(duì)指定流的錯(cuò)誤標(biāo)志進(jìn)行重置。
?
15.臨時(shí)文件
FILE?*tmpfile(?void?);
? ? 這個(gè)函數(shù)創(chuàng)建一個(gè)文件,當(dāng)文件被關(guān)閉或程序終止時(shí),這個(gè)文件便自動(dòng)刪除。這個(gè)文件以wb+模式打開(kāi),這使它可用于二進(jìn)制和文本數(shù)據(jù)。臨時(shí)文件的名字可以用tmpnam函數(shù)創(chuàng)建,它的原型如下:
char?*tmpnam(?char?*name?);
? ? 如果傳遞給函數(shù)的參數(shù)為NULL,那么這個(gè)函數(shù)便返回一個(gè)指向靜態(tài)數(shù)組的指針,該數(shù)組包含了被創(chuàng)建的文件名。否則,參數(shù)便假定是一個(gè)指向長(zhǎng)度至少為L(zhǎng)_tmpnam的字符數(shù)組的指針。在這個(gè)情況下,文件名在這個(gè)數(shù)組中創(chuàng)建,返回值就是這個(gè)參數(shù)。
?
16.文件操縱函數(shù)
int?remove(?char?const?*filename?); int?rename(?char?const?*oldname,?char?const?*newname?);
? ? 成功返回0值,失敗返回非0值。
?
?
數(shù)據(jù)類(lèi)型 | 輸入 | 輸出 | 描述 | |
---|---|---|---|---|
家族名 | 目的 | 可用于所有的流 | 只用于stdin和stdout | 內(nèi)存中的字符串 |
格式碼 | h | l | L | |
代碼 | 參數(shù) | 含義 | ||
代碼 | 參數(shù) | 含義 | ||
標(biāo)志 | 含義 | |||
from | 定位 |