版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
2023/2/51第四講C語言的輸入輸出與格式控制裘宗燕書第三章3.7節(jié)和第八章8.3節(jié)文件(File)是計算機的基本處理對象計算機具有強大的文件處理能力制作、儲存、加密、傳輸、歸檔、顯示、壓縮、…處理的文件類型多種多樣純文本文件,以txt為擴展名可執(zhí)行文件,以exe為擴展名Word文檔文件,以.doc/docx為擴展名演示稿文件,以.ppt為擴展名便攜式文檔格式文件,以.pdf為擴展名問題文件保存在什么地方?我們的程序能否處理文件?我們程序如何才能處理文件?有沒有一些所謂的標準文件?22023/2/5PDF文件列表32023/2/51.標準輸入輸出文件標準輸入/輸出文件是C程序中默認的基本文件,這兩個文件在程序開始運行時被自動打開,在程序結(jié)束時被自動關閉。默認情況下,標準輸入文件對應于鍵盤,標準輸出文件對應于顯示器。在C程序中,標準輸入文件(stdin)與任何其他輸入文件一樣,是一個可以從中按順序連續(xù)讀出字節(jié)流的數(shù)據(jù)來源。標準輸出文件(stdout)也與其他輸出文件一樣,是一個可以向其按順序連續(xù)寫入字節(jié)流的數(shù)據(jù)容器。標準輸入與輸出文件示意42023/2/5鍵盤:以文件的形式給電腦看,提供輸入。電腦可以看的紙。顯示器:被電腦當成書寫和展示設備,在程序中以文件的形式出現(xiàn)。電腦可以寫的紙人寫電腦看電腦寫人看52023/2/52.字符輸入輸出函數(shù)字符IO函數(shù)getchar和putchargetchar是無參函數(shù)從標準輸入讀一個字符,返回字符的編碼值。intgetchar(void)//注意返回值類似是int型。intgetc(stdin)典型使用(輸入的字符賦給變量c):c=getchar();標準輸入默認是鍵盤。沒有輸入數(shù)據(jù)時getchar等待,直到用戶輸入字符并換行。62023/2/5putchar函數(shù)原型:intputchar(intc)函數(shù)調(diào)用例子putchar('O');putchar('K');功能:把一個字符送到標準輸出(stdout)相當于:intputc(intc,stdout)#include<stdio.h>intmain(){intc;c=getchar();putchar(c);putchar('\n');return0;}72023/2/5總結(jié)正常情況下getchar返回讀入的字符,遇文件結(jié)束返回EOF(一個常量)值。應該用int變量接收getchar的返回值,以保證正確判斷輸入結(jié)束。如果用char變量,值超出char范圍時結(jié)果無定義。charch;while((ch=getchar())!=EOF)...intch82023/2/5例,統(tǒng)計文件中字符個數(shù)統(tǒng)計(由標準輸入得到的)文件中的字符個數(shù)。intCountInput(){intc;longn=0;while((c=getchar())!=EOF)n++;returnn;}標準輸入默認為鍵盤。程序執(zhí)行到getchar等待輸入,得到輸入后處理。用Ctrl-Z發(fā)信息可使循環(huán)結(jié)束。問題:能從普通文件中讀取數(shù)據(jù)嗎?92023/2/5從普通文件中讀入設以上源程序是count.c,編譯結(jié)果是count.exe。用命令行方式啟動該程序,將標準輸入定向到文件(設被統(tǒng)計文件是abcd.txt):count<abcd.txt讀入循環(huán)中可以完成對輸入內(nèi)容的各種處理,例如:統(tǒng)計某個字符出現(xiàn)的次數(shù),統(tǒng)計文件中的行數(shù)等等操作系統(tǒng)OS允許標準輸入重新定向。將標準輸入定向到文件可使文件成為getchar或scanf的輸入源。程序里不必區(qū)分實際輸入來自鍵盤還是實際文件。處理連續(xù)輸入時,這兩者沒有本質(zhì)差別。102023/2/5重定向標準輸出文件輸出數(shù)據(jù)重定向標準輸入文件輸入數(shù)據(jù)重定向變換輸入數(shù)據(jù)來源或輸出數(shù)據(jù)的去向,是操作系統(tǒng)命令行的功能。操作系統(tǒng)中常見的輸入輸出重定向方法輸入重定向語法命令行及參數(shù)<
輸入來源文件名設有可執(zhí)行文件count.exe,在控制臺命令窗口輸入命令:count//默認輸入為stdin,即鍵盤count<abc.txt//輸入重定向為abc.txt輸出重定向語法命令行及參數(shù)>
輸出去向文件名設有可執(zhí)行文件count.exe,在控制臺命令窗口輸入命令:count//默認輸入為stdout,即字符顯示器count>a.txt//輸入重定向為a.txt2023/2/511輸出重定向例子122023/2/5如程序名稱:hello.cpp,生成可執(zhí)行文件hello.exe#include"stdio.h"intmain(intargc,char*argv[]){ printf("HelloWorld!\n"); return0;}在命令行(cmd)運行:hello>a.txt,把輸出打印到a.txt文件。132023/2/53.標準I/O的行式輸入輸出對標準輸入/輸出流也有行式I/O函數(shù),原型:char*gets(char*s)intputs(constchar*s)gets讀一行到s,用'\0'代行尾'\n'并返回s。s應是字符數(shù)組。出錯或遇文件結(jié)束返回NULLputs將字符串s以及一個換行符輸出。正常完成返回非負值,出錯返回EOF用gets時應注意數(shù)組越界(無法限制寫入長度),應選用足夠大的數(shù)組142023/2/5一般用法一般使用形式:chars[256];...if(gets(s)!=NULL)......if(puts(s)!=EOF)...應檢查和處理操作未正常完成的情況。gets函數(shù)無長度控制,成為許多系統(tǒng)的安全漏洞。建議用fgets(buf,len,stdin)或者scanf(格式串里寫%ns,其中的n為長度限制)代替gets152023/2/54.scanfscanf從標準輸入(stdin)讀數(shù)據(jù),根據(jù)格式描述將實際輸入轉(zhuǎn)換到指定類型,轉(zhuǎn)換結(jié)果賦給指定變量:scanf(格式描述串,&變量名,...)格式描述串與printf的類似,其中的轉(zhuǎn)換描述(以%開頭)說明輸入形式和轉(zhuǎn)換方式。其他參數(shù)(個數(shù)應與格式串中轉(zhuǎn)換描述一致)指明接受輸入的程序變量。形式是在變量名前面加&符號。注意必須寫&符號,不寫將引起嚴重問題為什么?162023/2/5輸入格式控制scanf的原型:intscanf(constchar*format,...);相當于intfscanf(stdin,constchar*format,...);scanf將輸入流看成空白字符分隔的字段,讀入過程就是對這些字段的順序處理format指揮scanf進行轉(zhuǎn)換,成功轉(zhuǎn)換得到的值賦給對應變量(地址來自參數(shù))scanf處理完格式串或遇轉(zhuǎn)換失敗時結(jié)束,返回所完成的轉(zhuǎn)換項數(shù)172023/2/5format里各種字符的意義空白字符(空格/制表符)要求scanf跳過輸入中遇到的空白字符(空格、換行符、制表符)普通字符非轉(zhuǎn)換描述的非空白字符。要求scanf將它與輸入流下一個非空白字符匹配,字符相同時匹配成功,否則轉(zhuǎn)換失敗轉(zhuǎn)換描述一個轉(zhuǎn)換描述刻畫對流中下一字段的轉(zhuǎn)換方式。以字符%開始,到轉(zhuǎn)換字符結(jié)束182023/2/5轉(zhuǎn)換描述轉(zhuǎn)換描述,%之后可以有*表示只匹配不賦值;長度描述(整數(shù))指定輸入字符個數(shù);最后是轉(zhuǎn)換字符如d,f,x等,前面可加目標長度限制如l,h等。轉(zhuǎn)換順利完成時結(jié)果賦給參數(shù)所指變量(無*時)。若有長度描述就以指定個數(shù)的字符為字段。有星號(如%*s、%*6d等)時所匹配的東西不賦值,直接丟掉。192023/2/5簡單示例#include<stdio.h>intmain(){inti,n=0;
printf("Pleaseinputanumber:");scanf("%d",&n);printf("%d%d\n",n,n*n);return0;}從用戶在鍵盤輸入的字符流的當前位置之后嘗試讀一個十進數(shù)給出n的地址,告訴scanf函數(shù),將讀到數(shù)據(jù)看成是十進制數(shù),轉(zhuǎn)換后放入給定地址:&n202023/2/5轉(zhuǎn)換字符的意義轉(zhuǎn)換字符的意義,所要求實際輸入,對應參數(shù)類型:d十進制形式的整數(shù)。 (int*)i 整數(shù),可為十、八或十六進制表示。 (int*)o八進制整數(shù),可無先導字符0。 (int*)u無符號十進制整數(shù)。(unsigned*)x十六進制整數(shù),可無先導0x或0X。 (int*)c字符,指定輸入寬度可輸入多字符到字符數(shù)組。不跳過空白,讀入多字符后不加‘\0’。(char*)s 非空白字符序列,可有長度限制。在字符數(shù)組最后附加‘\0’(做成字符串)。 (char*)212023/2/5轉(zhuǎn)換字符的含義轉(zhuǎn)換字符的含義e,f,g符合C語言規(guī)定形式的浮點數(shù)。(float*)p指針值,形式與printf(“%p”)輸出一致。用于把由printf輸出的指針值讀回。 (void*)n向?qū)獏?shù)中寫入本次函數(shù)調(diào)用執(zhí)行到此已讀的字符個數(shù)。不實際讀入也不計轉(zhuǎn)換項數(shù)。(int*)[...]與所列字符的最長序列匹配,寫入數(shù)組并附‘\0’。用[]...]表示匹配串可含‘]’。 (char*)[^...]與不含所列字符的最長序列匹配,寫入數(shù)組并附‘\0’。[^]...]表示不含‘]’。(char*)%與輸入流中的字符%匹配,不賦值。222023/2/5轉(zhuǎn)換字符說明轉(zhuǎn)換字符d、i、o、u、x前面可以標明目標長度,h表示賦值目標為short;l表示賦值目標為long轉(zhuǎn)換字符e、f、g前加l表示目標是double,L表示是longdouble加了這些字符,scanf將按指定類型構(gòu)造和賦值未做轉(zhuǎn)換前出錯或者遇到文件結(jié)束時返回EOF其他情況下返回執(zhí)行中完成轉(zhuǎn)換的項數(shù),返回0表示第一個轉(zhuǎn)換失敗232023/2/5例scanf(“%ld”,&a)的處理過程scanf讀入并丟掉空白符號(可無),然后做匹配;若遇到的非空白字符不能看作數(shù),則匹配失??;否則就逐個讀入字符,直至遇到第一個非數(shù)字字符;將讀入的正負號及數(shù)字字符序列做成一個長整數(shù),賦給指定的變量;多個轉(zhuǎn)換描述的處理類似如果轉(zhuǎn)換失敗,引起失敗的字符仍在流中,下次調(diào)用輸入函數(shù)將先讀到這個字符242023/2/5注意事項輸入的數(shù)據(jù)之間一般只能有空白字符格式串里一般不寫轉(zhuǎn)換描述之外的東西。如果寫"%d,%lf,%f"就是要求用逗號分隔輸入數(shù)據(jù),若輸入時不注意就會導致數(shù)據(jù)不能正常讀入。建議不要這樣寫。scanf格式串的細節(jié)參看第四章及給大家發(fā)的資料。252023/2/5緩沖式輸入程序要求從標準輸入取得信息(如執(zhí)行scanf)時,若由鍵盤輸入,在按Enter鍵后程序才能得到輸入數(shù)據(jù)。造成這種情況的原因是操作系統(tǒng)通常采用“緩沖式”輸入方式,把來自鍵盤的輸入臨時保存在“輸入緩沖區(qū)”(操作系統(tǒng)管理下的一塊內(nèi)存區(qū)域)里。直至人按了Enter鍵,才把緩沖區(qū)里的數(shù)據(jù)送給程序,這時scanf等輸入函數(shù)才能讀到數(shù)據(jù)。262023/2/5深入理解scanfscanf的返回值是int,它順序處理格式串根據(jù)格式串要求完成輸入、轉(zhuǎn)換和對變量的賦值工作正常結(jié)束時返回所完成的數(shù)據(jù)轉(zhuǎn)換項數(shù)如果一開始就遇到文件結(jié)束,就返回一個特殊符號常量EOF(是一個int值,后面再介紹)如果沒處理完整個格式串就失敗時,返回已完成的數(shù)據(jù)轉(zhuǎn)換項數(shù)scanf用輸入數(shù)據(jù)與正在處理的轉(zhuǎn)換描述比較,如果相符就完成一項轉(zhuǎn)換。例如:若轉(zhuǎn)換描述是%d,輸入得到的是一串數(shù)字,就把它們轉(zhuǎn)換為一個整數(shù)如果實際輸入與轉(zhuǎn)換描述不匹配,轉(zhuǎn)換失敗自學272023/2/5關于scanfscanf要求三方面一致格式串中轉(zhuǎn)換描述、對應參數(shù)的類型、運行中提供的數(shù)據(jù)形式。假如格式串要求做整數(shù)轉(zhuǎn)換,賦給整型變量。若實際輸入不是一串數(shù)字,scanf也無法正常完成工作在格式串要求讀整數(shù)或者浮點數(shù),scanf會跳過遇到的空白字符,從下一非空白字符開始處理自學282023/2/5scanf的返回值下面函數(shù)調(diào)用可能產(chǎn)生三種返回值:scanf("%lf",&x)返回1表示成功讀入一項數(shù)據(jù),并存入了x返回0表示讀入數(shù)據(jù)失敗返回EOF值表示遇到文件結(jié)束應該通過這種性質(zhì)控制循環(huán)例:讀入一些圓盤半徑,算出各圓盤的面積并輸出。不知圓盤數(shù),可利用scanf的返回值控制循環(huán)結(jié)束自學292023/2/5如何輸入一批數(shù)據(jù)通過一個循環(huán)處理,在循環(huán)中反復調(diào)用輸入函數(shù),分兩種情況如果事先知道需要輸入數(shù)據(jù)的項數(shù),就可以用計數(shù)器控制輸入循環(huán)。否則就需要用特殊標志或方法結(jié)束循環(huán)用一個特殊數(shù)據(jù)作為最后一個數(shù)的標志用EOF(endoffile)結(jié)束輸入每輸入一個數(shù)后讓用戶確認是否還有新數(shù)302023/2/5程序#include<stdio.h>voidpc_area(doubler){/*定義略*/}intmain(){doublex;while(scanf("%lf",&x)==1){if(x<0)printf("Inputerror:%f\n",x);elsepc_area(x);}return0;}/*什么情況下循環(huán)結(jié)束?*/確保能正確地讀入一個數(shù),不會異常終止自學312023/2/5文件結(jié)束符EOF遇到文件結(jié)束或錯誤數(shù)據(jù)時scanf不返回1。如果上面程序遇到輸入字母m,轉(zhuǎn)換失敗就會導致循環(huán)結(jié)束。更好的方式是利用標準庫定義的符號常量EOF。如果把標準輸入定向到某個文件,在讀完文件里所有數(shù)據(jù)后scanf就會返回EOF值。在標準輸入中,組合鍵:CTRL+Z或者Ctrl-D表示EOF值。322023/2/5EOF是什么一般的C系統(tǒng)把EOF定義為-1,它一定不是正數(shù),不會與scanf的其他返回值混淆。默認情況下,標準輸入從鍵盤得到數(shù)據(jù)。許多系統(tǒng)里可以用Ctrl-Z或Ctrl-D組合鍵送入文件結(jié)束信息。前面程序運行時,如果按了這種組合鍵,scanf就會返回EOF并導致循環(huán)結(jié)束。332023/2/5例統(tǒng)計一批輸入數(shù)據(jù)的個數(shù)和最小值/最大值/平均值解決方法循環(huán)讀入數(shù)據(jù),并完成其他工作。兩個變量記錄已知的最小、最大值。讀數(shù)據(jù)中考慮更新,使其保存已讀數(shù)據(jù)的最小最大值(循環(huán)不變性質(zhì))。兩個變量記錄數(shù)據(jù)個數(shù),記錄已讀入數(shù)據(jù)之和。循環(huán)中要正確更新(循環(huán)不變性質(zhì))。342023/2/5問題保存最大值和最小值的變量的初始值?解決辦法假定最少有一個輸入數(shù)據(jù)用讀入的第一個數(shù)據(jù)作為最大和最小變量的初始值。352023/2/5#include<stdio.h>intmain(){doublesum=0.0,biggest,smallest,x;intcount=1;scanf("%lf",&sum);
biggest=smallest=sum;while(scanf("%lf",&x)==1){sum+=x;count++;if(x>biggest)biggest=x;if(x<smallest)smallest=x;}
…/*輸出結(jié)果,略*/return0;} /*要求至少有一個輸入數(shù)據(jù)*/362023/2/55.輸出格式控制以printf為例(其他格式化輸出函數(shù)同)原型:intprintf(constchar*format,...);功能format里的非轉(zhuǎn)換描述直接輸出根據(jù)轉(zhuǎn)換描述順序轉(zhuǎn)換各實參,結(jié)果插入在format里相應位置,形成整個輸出出錯時返回負值正常完成返回實際輸出的字符個數(shù)372023/2/5轉(zhuǎn)換描述轉(zhuǎn)換描述從%開始到轉(zhuǎn)換字符止,中間可有若干字符,順序地可以有如下成分(都可缺):1)標志字符:下面字符可以以任意順序出現(xiàn):-轉(zhuǎn)換結(jié)果在字段范圍內(nèi)左對齊+數(shù)值前面總輸出正負號 空格,轉(zhuǎn)換得到的首字符不是正負號時輸出一個空格0若數(shù)值輸出不能填滿字段,前面全填0#指定另一種形式。對轉(zhuǎn)換符o的數(shù)值前加0;x和X的非0結(jié)果前加0x或0X;e、E、f、g、G輸出時總寫小數(shù)點;g和G,不去掉最后的0。382023/2/5說明2)最小字段寬度(整數(shù))。轉(zhuǎn)換結(jié)果至少占這么寬,可更寬。若得到的序列不夠,在左邊(或右邊,有+時)填空格。數(shù)值在有0標志時在數(shù)字序列左邊填0。3)圓點及另一數(shù)。對字符串參數(shù)表示最大輸出字符數(shù);對e、E、f表示小數(shù)點后數(shù)位;對g、G表示有效數(shù)位;對整數(shù)表示最小輸出數(shù)字個數(shù),不夠時左邊添0。4)目標長度字符h、l或L。h和l用于整參數(shù),h指short或unsignedshort;l指long或unsignedlong。L指longdouble。字段寬度/精度可寫*,表示值由參數(shù)取得。提供值的參數(shù)必須是int。392023/2/5轉(zhuǎn)換字符轉(zhuǎn)換字符,所要求參數(shù)類型和實際輸出形式:d,i帶符號的十進制形式整數(shù)(int)o無符號八進制表示的整數(shù),無先導0(int)x,X無符號十六進制整數(shù),無先導0x或0X。用x時十以上數(shù)字用abcdef;對X用ABCDEF(int)u無符號十進制整數(shù)(int)c 字符,轉(zhuǎn)為unsignedchar輸出(int)s 字符序列,從參數(shù)所指位置直到字符‘\0’,或者達到字段的指定寬度為止(char*)f 一般實數(shù)形式[-]mmm.ddd,小數(shù)點后位數(shù)由精度描述定,默認6。精度為0不輸出小數(shù)點(double)402023/2/5轉(zhuǎn)換字符e,E 科學記數(shù)法[-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度體育賽事運營管理場規(guī)則與格式規(guī)范3篇
- 二零二四年度一致行動人文化旅游產(chǎn)業(yè)合作協(xié)議合同3篇
- 2025年水電安裝工程設備采購與安裝合同6篇
- 2025賓館與旅游公司聯(lián)合運營客房租賃合同范本2篇
- 2024物流企業(yè)稅收優(yōu)惠適用合同
- 2025年度充電樁充電樁項目融資與投資合同3篇
- 2025廠房買賣合同模板:工業(yè)地產(chǎn)投資合作框架3篇
- 2025年度龍門吊拆除設備再利用及資源化利用合同范本4篇
- 2025年度裝飾藝術玻璃定制銷售合同3篇
- 二零二四年倉儲物流中心停車場租賃及倉儲服務合同3篇
- 公司SWOT分析表模板
- 小學預防流行性感冒應急預案
- 肺癌術后出血的觀察及護理
- 聲紋識別簡介
- 生物醫(yī)藥大數(shù)據(jù)分析平臺建設-第1篇
- 基于Android的天氣預報系統(tǒng)的設計與實現(xiàn)
- 沖鋒舟駕駛培訓課件
- 美術家協(xié)會會員申請表
- 聚合收款服務流程
- 中石化浙江石油分公司中石化溫州靈昆油庫及配套工程項目環(huán)境影響報告書
- 搞笑朗誦我愛上班臺詞
評論
0/150
提交評論