日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C語言中的輸入與輸出

作者:lonely-hermit 更新時間: 2022-05-13 編程語言

C語言的標(biāo)準(zhǔn)庫實(shí)現(xiàn)了簡單地文本輸入和輸出,文本流由一系列行組成,行的結(jié)尾是換行符,如果該系統(tǒng)并沒有遵循這種模式,則標(biāo)準(zhǔn)庫將通過一系列措施使得該系統(tǒng)適應(yīng)這種模式,例如標(biāo)準(zhǔn)庫可以在輸入端將回車符和換頁符都轉(zhuǎn)換為換行符,而在輸出端進(jìn)行反向轉(zhuǎn)換。

一、getchar

int getchar(void);

這是最簡單的輸入函數(shù),他可以從命令行一次讀取一個字符,如果遇到文件結(jié)尾則返回EOF,EOF一般在 stdio.h 中被定義為-1。

在許多環(huán)境中,可以用 < 來實(shí)現(xiàn)輸入重定向,它將把鍵盤輸入替換為文件輸入:如果程序prog中使用了函數(shù)getchar,則命令行

// 將infile文件輸入到prog
prog < infile

// 將prog的輸出到文件infile中
prog > infile

將使得程序prog從輸入文件infile(而不是鍵盤)中讀取字符,實(shí)際上,程序prog并不在乎輸入方式的改變,并且字符串“

otherprog | prog

使用輸入輸出函數(shù)的每個源文件必須在應(yīng)用這些函數(shù)之前包含下列語句

#include 

當(dāng)文件名用尖括號包含時,預(yù)處理器將在由具體實(shí)現(xiàn)定義的有關(guān)位置中查找指定文件(UNIX: /usr/include),找不到將在當(dāng)前的項目下尋找。

二、printf

輸出函數(shù)printf將內(nèi)部數(shù)值轉(zhuǎn)換為字符的形式,這個是大家最常用的輸出函數(shù),下面是他的完整描述,我們主要給出一些參數(shù)

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

在字符%和轉(zhuǎn)換字符中間可能依次包含以下內(nèi)容:

(1)負(fù)號:指定被轉(zhuǎn)換參數(shù)按照左對齊方式輸出

(2)數(shù)字:指定最小字段參數(shù)

(3)小數(shù)點(diǎn):將字段寬度和精度分開

(4)數(shù)字:用于指定精度,浮點(diǎn)數(shù)小數(shù)點(diǎn)后面位數(shù),整型最少輸出的數(shù)字?jǐn)?shù)目

(5)字母h或者l:h將整數(shù)作為short打印,l將整型作為long打印

字符 參數(shù)類型;輸出格式
d,i int類型,十進(jìn)制數(shù)
o int類型,無符號八進(jìn)制數(shù)(沒有前導(dǎo)o)
x,X int類型,無符號十六進(jìn)制數(shù)(沒有前導(dǎo)ox或oX),10-15分別是A-F
u int類型,無符號十進(jìn)制數(shù)
c int類型,單個字符
s char*類型,打印字符串
f double類型,十進(jìn)制小數(shù) [-]m.dddddd ,d的個數(shù)由精度確定,默認(rèn)為6
e,E double類型,[-]m.dddddd e + xx,d的個數(shù)由精度確定,默認(rèn)為6
p void*類型,指針類型
% 不轉(zhuǎn)換參數(shù),打印百分號

三、sprintf

int sprintf(char *string,char *format,arg1,arg2,...);

sprintf函數(shù)和printf函數(shù)一樣,但是將輸出結(jié)果放到了string中,而不是標(biāo)準(zhǔn)輸出中,string必須足夠大用來存放輸出結(jié)果。

temp.c

#include

int main(int argc,char *argv[]){
    char string[1000];
    char *s = "123456";
    sprintf(string,"%s\n",s);
    printf("%s",string);
    return 0;
}

四、scanf

輸入函數(shù)scanf相對應(yīng)于輸出函數(shù)printf,他與后者相反的方向上提供同樣的轉(zhuǎn)換功能,當(dāng)scanf函數(shù)掃描完其格式串,或者碰到某些無法與個數(shù)控制說明匹配的情況時,函數(shù)將終止。如果達(dá)到文件結(jié)尾,給函數(shù)返回EOF,返回EOF與0是不用的,0表示出現(xiàn)了不匹配,EOF表示達(dá)到了文件末尾,sscanf用于從字符串中(而不是標(biāo)準(zhǔn)輸入)讀取字符序列。

int scanf(char *format,...)
int sscanf(char *string,char *format,...)

我們讀取一個日期序列“25 Dec 1988”

#include 

int main(){
	int day,year;
	char monthname[20];
	
	scanf("%d %s %d",&day,monthname,&year);
	return 0;
}

五、文件訪問

在讀寫一個文件之前,必須通過fopen庫函數(shù)打開改文件,fopen用類似于x.c或y.c這樣的外部名與操作系統(tǒng)之間進(jìn)行某些必要的連接和通信,并返回一個隨后可以用于文件讀寫和操作的指針。

該指針被稱為文件指針,它指向一個包含文件信息的結(jié)構(gòu),這些信息包括:緩沖區(qū)的位置,緩沖區(qū)中當(dāng)前字符的位置,文件的讀或者寫的狀態(tài)、是否出錯或者是否已經(jīng)到達(dá)文件結(jié)尾等,用戶不必關(guān)心這些細(xì)節(jié),我們只需要聲明一個文件指針,在下面例子中,請注意,F(xiàn)ILE像int一樣是一個類型名,而不是結(jié)構(gòu)標(biāo)記,他是通過typedef定義的。

FILE *fp;
FILE *fopen(char *name,char *mode);
// 第一個參數(shù)為文件名
// 第二個參數(shù)為模式:讀“r”寫“w”追加“a”,某些系統(tǒng)還區(qū)分二進(jìn)制文件“b”

// 關(guān)閉打開的文件
void fclose(FILE *fp);

文件被打開后就需要考慮怎么讀的問題,最簡單的是getc

int getc(FILE *fp);

返回fp指向輸入流中的下一個字符,如果到達(dá)文件末尾或者出現(xiàn)錯誤,該函數(shù)將返回EOF

int putc(int c,FILE *fp);

將字符c寫入fp指定的文件中,并返回寫入的字符,如果發(fā)生錯誤返回EOF

類似于getchar和putchar,getc和putc是宏而不是函數(shù)

啟動一個c程序時,操作系統(tǒng)將打開三個文件,并將三個文件的指針分別提供給該程序,這三個文件分別是標(biāo)準(zhǔn)輸入stdin,標(biāo)準(zhǔn)輸出stdout,和標(biāo)準(zhǔn)錯誤stderr,他們在中申明,在大多數(shù)環(huán)境中,stdin指向鍵盤,stdout和stderr指向顯示器,但是我們知道stdin和stdout可以被重定向到文件或者管道。

那么getchar和putchar就可以被這么定義

#define getchar() getc(stdin);
#define putchar(c) putc((c),stdout);

對于文件的格式化輸入和輸出可以使用函數(shù)fscanf和fprintf

int fscanf(FILE *fp,char *format,...);
int fprintf(FILE *fp,char *format,...);

六、錯誤處理

我們可以通過向stderr寫入錯誤信息來將輸出寫到錯誤日志內(nèi),寫到stderr的輸出通常也會顯示到屏幕上。

#include 

int main() {
    fprintf(stderr,"%s","this is an error example");
    return 0;
}

標(biāo)準(zhǔn)庫函數(shù)exit,當(dāng)該函數(shù)被調(diào)用時,他將終止調(diào)用程序的執(zhí)行,任何調(diào)用該程序的進(jìn)程都可以獲取exit的參數(shù)值,因此,可以通過另一個將該進(jìn)程作為子進(jìn)程的程序來測試該程序的執(zhí)行是否成功,按照管理返回0表示一切正常,返回非0值通常表示出現(xiàn)了異常情況,

在主程序main中,語句return expr等價于exit(expr),使用exit有一個優(yōu)點(diǎn)就是可以從其他函數(shù)中調(diào)用,整個程序中只要調(diào)用了exit就結(jié)束。

exit是結(jié)束一個進(jìn)程,它將刪除進(jìn)程使用的內(nèi)存空間,同時把錯誤信息返回父進(jìn)程;而return是返回函數(shù)值并退出函數(shù)。

#include 
#include 

int main() {
    fprintf(stderr,"%s","this is an error example");
    exit(1);
}

/* 的到的輸出為:
this is an error example
進(jìn)程已結(jié)束,退出代碼 1

我們可以看到退出代碼是1,而不是0,表示非正常退出
*/

如果流fp中出現(xiàn)錯誤,則函數(shù)ferror返回一個非零值。

int ferror(FILE *fp);

如果文件到達(dá)末尾則返回一個非零值

int feof(FILE *fp);

七、行輸入和行輸出

char *fgets(char *line,int maxline,FILE *fp);

fgets函數(shù)從fp指向的文件中讀取下一個輸入行,包括換行符,并將它存放在字符數(shù)組line中,最多讀取maxline-1個字符。

char *fputs(char *line,FILE *fp);

fputs將一個字符串(不需要包含換行符)寫到一個文件中。

原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/124697368

欄目分類
最近更新