當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]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)確原因。p

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值。

?

?

執(zhí)行字符、文本行和二進(jìn)制I/O的函數(shù)
數(shù)據(jù)類(lèi)型輸入輸出描述
家族名目的可用于所有的流只用于stdin和stdout內(nèi)存中的字符串
格式碼hlL
代碼參數(shù)含義
代碼參數(shù)含義
標(biāo)志含義
from定位
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉