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

學無先后,達者為師

網站首頁 編程語言 正文

C語言中的輸入與輸出

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

C語言的標準庫實現了簡單地文本輸入和輸出,文本流由一系列行組成,行的結尾是換行符,如果該系統并沒有遵循這種模式,則標準庫將通過一系列措施使得該系統適應這種模式,例如標準庫可以在輸入端將回車符和換頁符都轉換為換行符,而在輸出端進行反向轉換。

一、getchar

int getchar(void);

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

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

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

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

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

otherprog | prog

使用輸入輸出函數的每個源文件必須在應用這些函數之前包含下列語句

#include 

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

二、printf

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

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

在字符%和轉換字符中間可能依次包含以下內容:

(1)負號:指定被轉換參數按照左對齊方式輸出

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

(3)小數點:將字段寬度和精度分開

(4)數字:用于指定精度,浮點數小數點后面位數,整型最少輸出的數字數目

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

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

三、sprintf

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

sprintf函數和printf函數一樣,但是將輸出結果放到了string中,而不是標準輸出中,string必須足夠大用來存放輸出結果。

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

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

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庫函數打開改文件,fopen用類似于x.c或y.c這樣的外部名與操作系統之間進行某些必要的連接和通信,并返回一個隨后可以用于文件讀寫和操作的指針。

該指針被稱為文件指針,它指向一個包含文件信息的結構,這些信息包括:緩沖區的位置,緩沖區中當前字符的位置,文件的讀或者寫的狀態、是否出錯或者是否已經到達文件結尾等,用戶不必關心這些細節,我們只需要聲明一個文件指針,在下面例子中,請注意,FILE像int一樣是一個類型名,而不是結構標記,他是通過typedef定義的。

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

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

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

int getc(FILE *fp);

返回fp指向輸入流中的下一個字符,如果到達文件末尾或者出現錯誤,該函數將返回EOF

int putc(int c,FILE *fp);

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

類似于getchar和putchar,getc和putc是宏而不是函數

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

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

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

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

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

六、錯誤處理

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

#include 

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

標準庫函數exit,當該函數被調用時,他將終止調用程序的執行,任何調用該程序的進程都可以獲取exit的參數值,因此,可以通過另一個將該進程作為子進程的程序來測試該程序的執行是否成功,按照管理返回0表示一切正常,返回非0值通常表示出現了異常情況,

在主程序main中,語句return expr等價于exit(expr),使用exit有一個優點就是可以從其他函數中調用,整個程序中只要調用了exit就結束。

exit是結束一個進程,它將刪除進程使用的內存空間,同時把錯誤信息返回父進程;而return是返回函數值并退出函數。

#include 
#include 

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

/* 的到的輸出為:
this is an error example
進程已結束,退出代碼 1

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

如果流fp中出現錯誤,則函數ferror返回一個非零值。

int ferror(FILE *fp);

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

int feof(FILE *fp);

七、行輸入和行輸出

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

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

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

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

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

欄目分類
最近更新