用fputs()把一個(gè)字符串寫(xiě)入到文件中
int fputs (char string, FILE fp) ;
功能:把字符串string寫(xiě)入到文件fp中
若fp為stdout,則為向屏幕輸出。
int printf ( char const format, …… ) ;
int fprintf ( FILE fp, char const format, …… ) ;
int sprintf ( char const string, char const *format, ……) ;
//以上函數(shù)的輸出字符規(guī)則都相同,不同的是它們寫(xiě)入的流不同,一個(gè)是向屏幕寫(xiě)入、一個(gè)向文件流寫(xiě)入、一個(gè)向字符串寫(xiě)入。
printf函數(shù)允許你為欲打印的數(shù)據(jù)指定精度
。對(duì)于不同類型的數(shù)據(jù)而言,精度的含義是不一樣的。
精度與整型轉(zhuǎn)換說(shuō)明符%d
一起使用時(shí),表示要打印的數(shù)據(jù)的最少數(shù)字位數(shù)。如果將要打印的數(shù)據(jù)所包含的數(shù)字的位數(shù)小于指定的精度,同時(shí)精度值前面帶有一個(gè)0或者一個(gè)小數(shù)點(diǎn),則加填充0。
精度與浮點(diǎn)型轉(zhuǎn)換說(shuō)明符%f
一起使用時(shí),表示將要打印的最大有效數(shù)字位數(shù)。
精度與字符串轉(zhuǎn)換說(shuō)明符%s
一起使用時(shí),表示將要從一個(gè)字符串中打印出來(lái)的最大字符個(gè)數(shù)。(可用于控制打出的字符的個(gè)數(shù))表示精度的方法是:在百分號(hào)和轉(zhuǎn)換說(shuō)明符之間,插入一個(gè)表示精度的整數(shù),并在整數(shù)的前面加上一個(gè)小數(shù)點(diǎn)。
域?qū)捄途?/strong>可以放在一起使用,方法是:在百分號(hào)和轉(zhuǎn)換說(shuō)明符之間,先寫(xiě)上域?qū)?,然后加上一個(gè)小數(shù)點(diǎn),后面再寫(xiě)上精度。
例:
printf(“%9.3f”, 123.456789) ;
的輸出結(jié)果是123.456
還可以用變量來(lái)控制域?qū)捄途?/strong>(可用于關(guān)于精度的舍入)
在格式控制字符串中表示域?qū)捇蚓鹊奈恢蒙蠈?xiě)上一個(gè)星號(hào) * ,然后程序?qū)?huì)計(jì)算實(shí)參列表中相對(duì)應(yīng)的整型實(shí)參值,并用其替換星號(hào)。
例:
printf(“% . f”, 7, 2, 98.736) ; 將以7為域?qū)挘?為精度,輸出右對(duì)齊的98.74
表示域?qū)挼闹悼梢允钦龜?shù),也可以是負(fù)數(shù)(將導(dǎo)致輸出結(jié)果在域?qū)拑?nèi)左對(duì)齊)
printf函數(shù)還提供了一些標(biāo)記來(lái)增加它的輸出格式控制功能,在格式控制字符串中可以使用的標(biāo)記有:
-(減號(hào))
在域?qū)拑?nèi)左對(duì)齊顯示輸出結(jié)果 +(加號(hào))
在正數(shù)前面顯示一個(gè)加號(hào),在負(fù)數(shù)前面顯示一個(gè)減號(hào) 空格
在不帶加號(hào)標(biāo)記的正數(shù)前面打印一個(gè)空格 #(井號(hào))
當(dāng)使用的是八進(jìn)制轉(zhuǎn)換說(shuō)明符o時(shí),在輸出數(shù)據(jù)前面加上前綴0 ; 當(dāng)使用的是十六進(jìn)制轉(zhuǎn)換說(shuō)明符x或X時(shí),在輸出數(shù)據(jù)前面加上前綴0x或0X 0(零)
在打印的數(shù)據(jù)前面加上前導(dǎo)0printf("%4$d %3$d %2$d %1$d", 1, 2, 3, 9); //將會(huì)打印9 3 2 1
printf 返回值是輸出的字符個(gè)數(shù)。
#include <stdio.h>
int main()
{
int i=43;
printf("%d\n",printf("%d",printf("%d",i)));
return 0;
}//程序會(huì)輸出4321
在進(jìn)行輸入/輸出時(shí),程序并不是馬上從輸入/輸出設(shè)備處理數(shù)據(jù),而是先把數(shù)據(jù)放到緩存中,當(dāng)緩存滿時(shí)才進(jìn)行輸入/輸出操作(或是遇到刷新操作,比如遇到換行或 fflush )。
C 實(shí)現(xiàn)通常允許程序員設(shè)置流的緩存大小。
void setbuf (FILE steam, char buf) ;
參數(shù) buf 必須指向一個(gè)長(zhǎng)度為 BUFSIZ (定義在 stdio.h 頭文件中)的緩沖區(qū)。
例:
setbuf (stdout, buf) ;
將告訴 I/O 庫(kù)寫(xiě)入到 stdout 中的輸出要以 buf 作為一個(gè)輸出緩沖,并且等到 buf 滿了或程序員直接調(diào)用 fflush() 再實(shí)際寫(xiě)出。
將buf參數(shù)設(shè)置為NULL,可關(guān)閉緩沖。
例:
下面的程序解釋了通過(guò)使用 setbuf() 來(lái)把標(biāo)準(zhǔn)輸入復(fù)制到標(biāo)準(zhǔn)輸出:
#include <stdio.h>
int main()
{
int c;
char buf[BUFSIZ];
setbuf(stdout, buf);
while((c = getchar()) != EOF)
putchar(c);
return 0 ;
}
這段程序隱藏著一個(gè)細(xì)微的Bug:
緩沖區(qū)最后一次刷新是在主程序完成之后,庫(kù)將控制交回到操作系統(tǒng)之前所執(zhí)行的清理的一部分。在這一時(shí)刻,緩沖區(qū)已經(jīng)被釋放了?。磎ain函數(shù)棧清空之后)
有兩種方法可以避免這一問(wèn)題:
使用靜態(tài)緩沖區(qū),或者將其顯式地聲明為靜態(tài)
static char buf[BUFSIZ];
或者將整個(gè)聲明移到主函數(shù)之外。
更多建議: