在程序中一般用cout和插入運(yùn)算符“”實(shí)現(xiàn)輸出,cout流在內(nèi)存中有相應(yīng)的緩沖區(qū)。有時(shí)用戶還有特殊的輸出要求,例如只輸出一個(gè)字符。ostream類(lèi)除了提供上面介紹過(guò)的用于格式控制的成員函數(shù)外,還提供了專(zhuān)用于輸出單個(gè)字符的成員函數(shù)put。如:
目前創(chuàng)新互聯(lián)建站已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、臨夏網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
cout.put('a');
調(diào)用該函數(shù)的結(jié)果是在屏幕上顯示一個(gè)字符a。put函數(shù)的參數(shù)可以是字符或字符的ASCII代碼(也可以是一個(gè)整型表達(dá)式)。如
cout.put(65 + 32);
也顯示字符a,因?yàn)?7是字符a的ASCII代碼。
可以在一個(gè)語(yǔ)句中連續(xù)調(diào)用put函數(shù)。如:
cout.put(71).put(79).put(79). put(68).put('\n');
在屏幕上顯示GOOD。
[例13.4] 有一個(gè)字符串"BASIC",要求把它們按相反的順序輸出。
#include iostreamusing namespace std;int main( )
{ ? char *a="BASIC";//字符指針指向'B'
for(int i=4;i=0;i--)
cout.put(*(a+i)); ? ? ? ? ? ? ? ? ?//從最后一個(gè)字符開(kāi)始輸出
cout.put('\n'); ? return 0;
}
除了使用cout.put函數(shù)輸出一個(gè)字符外,還可以用putchar函數(shù)輸出一個(gè)字符。putchar函數(shù)是C語(yǔ)言中使用的,在stdio.h頭文件中定義。C++保留了這個(gè)函數(shù),在iostream頭文件中定義。
[例13.4] 也可以改用putchar函數(shù)實(shí)現(xiàn)。
#include iostream ?//也可以用#include stdio.h,同時(shí)不要下一行using namespace std;int main( )
{ ? char *a="BASIC"; ? for(int i=4;i=0;i--)
putchar(*(a+i));
putchar('\n');
}
成員函數(shù)put不僅可以用cout流對(duì)象來(lái)調(diào)用,而且也可以用ostream類(lèi)的其他流對(duì)象調(diào)用。
cin輸入流詳解
標(biāo)準(zhǔn)輸入流是從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))流向程序的數(shù)據(jù)。在頭文件iostream.h中定義了cin、cout、cerr、clog 4個(gè)流對(duì)象(詳情請(qǐng)查看:與C++輸入輸出有關(guān)的類(lèi)和對(duì)象),cin是輸入流,cout、cerr、clog是輸出流。
cin是istream類(lèi)的對(duì)象,它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))獲取數(shù)據(jù),程序中的變量通過(guò)流提取符“”從流中提取數(shù)據(jù)。流提取符“”從流中提取數(shù)據(jù)時(shí)通常跳過(guò)輸入流中的空格、tab鍵、換行符等空白字符。
注意:只有在輸入完數(shù)據(jù)再按回車(chē)鍵后,該行數(shù)據(jù)才被送入鍵盤(pán)緩沖區(qū),形成輸入流,提取運(yùn)算符“”才能從中提取數(shù)據(jù)。需要注意保證從流中讀取數(shù)據(jù)能正常進(jìn)行。
例如:
int a,b;
cinab;
若從鍵盤(pán)上輸入
21 ?abc↙
變量a從輸入流中提取整數(shù)21,提取操作成功,此時(shí)cin流處于正常狀態(tài)。但在變量b準(zhǔn)備提取一個(gè)整數(shù)時(shí),遇到了字母a,顯然提取操作失敗了,此時(shí),cin流被置為出錯(cuò)狀態(tài)。只有在正常狀態(tài)時(shí),才能從輸入流中提取數(shù)據(jù)。
當(dāng)遇到無(wú)效字符或遇到文件結(jié)束符(不是換行符,是文件中的數(shù)據(jù)已讀完)時(shí),輸入流cin就處于出錯(cuò)狀態(tài),即無(wú)法正常提取數(shù)據(jù)。此時(shí)對(duì)cin流的所有提取操作將終止。在 IBM PC及其兼容機(jī)中,以Ctrl + Z表示文件結(jié)束符。在UNIX和Macintosh系統(tǒng)中,以 Ctrl + D表示文件結(jié)束符。當(dāng)輸入流cin處于出錯(cuò)狀態(tài)時(shí),如果測(cè)試cin的值,可以發(fā)現(xiàn)它的值為false(假),即cin為0值。如果輸入流在正常狀態(tài),cin的值為true(真),即cin為 一個(gè)非0值??梢酝ㄟ^(guò)測(cè)試cin的值,判斷流對(duì)象是否處于正常狀態(tài)和提取操作是否成功。如:
if(!cn) //流cin處于出銷(xiāo)狀態(tài),無(wú)法正常提取數(shù)據(jù)
cout"error";
[例13.5] 通過(guò)測(cè)試cin的真值,判斷流對(duì)象是否處于正常狀態(tài)。
#include iostreamusing namespace std;int main( )
{ ? float grade;
cout"enter grade:"; ? while(cingrade)//能從cin流讀取數(shù)據(jù) ? { ? ? ?if(grade=85) coutgrade"GOOD!"endl; ? ? ?if(grade60) coutgrade"fail!"endl;
cout"enter grade:";
}
cout"The end."endl; ? return 0;
}
流提取符“”不斷地從流中提取數(shù)據(jù)(每次提取一個(gè)浮點(diǎn)數(shù)),如果成功,就陚給 grade,此時(shí)cin為真,若不成功則cin為假。如果鍵入文件結(jié)束符,表示數(shù)據(jù)已完。
運(yùn)行情況如下:
enter grade: 67↙
enter grade: 89↙
89 GOOD!
enter grade: 56↙
56 fail!
enter grade: 100↙
100 GOOD!
enter grade: ^Z↙//鍵入文件結(jié)束符
The end.
在遇到文件結(jié)束符時(shí),程序結(jié)束。如果某次輸入的數(shù)據(jù)為
enter grade: 100/2↙
流提取符""提取100,賦給grade,進(jìn)行if語(yǔ)句的處理。然后再遇到"/",認(rèn)為是無(wú)效字符,cin返回0。循環(huán)結(jié)束,輸出"The end."。
在不同的C++系統(tǒng)下運(yùn)行此程序,在最后的處理上有些不同。以上是在GCC環(huán)境下運(yùn)行程序的結(jié)果,如果在VC++環(huán)境(筆者使用win7系統(tǒng))下運(yùn)行此程序,在鍵入Ctrl + Z 時(shí),需要敲擊兩次回車(chē),程序才輸出"The end."。
get()函數(shù)讀入一個(gè)字符
get()函數(shù)是cin輸入流對(duì)象的成員函數(shù),它有3種形式:無(wú)參數(shù)的,有一個(gè)參數(shù)的,有3個(gè)參數(shù)的。
1) 不帶參數(shù)的get函數(shù)
其調(diào)用形式為
cin.get()
用來(lái)從指定的輸入流中提取一個(gè)字符(包括空白字符),函數(shù)的返回值就是讀入的字符。 若遇到輸入流中的文件結(jié)束符,則函數(shù)值返回文件結(jié)束標(biāo)志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考慮到不與字符的ASCII代碼混淆,但不同的C ++系統(tǒng)所用的EOF值有可能不同。
[例13.6] 用get函數(shù)讀入字符。
#include iostreamusing namespace std;int main( )
{ ? int c;
cout"enter a sentence:"endl; ? while((c=cin.get())!=EOF)
cout.put(c); ? return 0;
}
運(yùn)行情況如下:
enter a sentence:
I study C++ very hard.↙(輸入一行字符)
I study C++ very hard.????????????? (輸出該行字符)
^Z↙(程序結(jié)束)
C語(yǔ)言中的getchar函數(shù)與流成員函數(shù)cin.get( )的功能相同,C++保留了C的這種用法,可以用getchar(c)從鍵盤(pán)讀入一個(gè)字符賦給c。
2) 有一個(gè)參數(shù)的get函數(shù)
其調(diào)用形式為
cin.get(ch)
其作用是從輸入流中讀取一個(gè)字符,賦給字符變量ch。如果讀取成功則函數(shù)返回true(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回false(假)。例13.6可以改寫(xiě)如下:
#include iostreamusing namespace std;int main( )
{ ? char c;
cout"enter a sentence:"endl; ? while(cin.get(c)) ?//讀取一個(gè)字符賦給字符變量c,如果讀取成功,cin.get(c)為真 ? {cout.put(c);}
cout"end"endl; ? return 0;
}
3) 有3個(gè)參數(shù)的get函數(shù)
其調(diào)用形式為
cin.get(字符數(shù)組, 字符個(gè)數(shù)n, 終止字符)
或
cin.get(字符指針, 字符個(gè)數(shù)n, 終止字符)
其作用是從輸入流中讀取n-1個(gè)字符,賦給指定的字符數(shù)組(或字符指針指向的數(shù)組),如果在讀取n-1個(gè)字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回true(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回false(假)。再將例13.6改寫(xiě)如下:
#include iostreamusing namespace std;int main( )
{ ? char ch[20];
cout"enter a sentence:"endl;
cin.get(ch,10,'\\n');//指定換行符為終止字符
coutchendl; ? return 0;
}
運(yùn)行情況如下:
enter a sentence:
I study C++ very hard.↙
I study
在輸入流中有22個(gè)字符,但由于在get函數(shù)中指定的n為10,讀取n -1個(gè)(即9個(gè))字符并賦給字符數(shù)組ch中前9個(gè)元素。有人可能要問(wèn):指定n-10,為什么只讀取9個(gè)字符呢?因?yàn)榇娣诺氖且粋€(gè)字符串,因此在9個(gè)字符之后要加入一個(gè)字符串結(jié)束標(biāo)志,實(shí)際上存放到數(shù)組中的是10個(gè)字符。請(qǐng)讀者思考:如果不加入字符串結(jié)束標(biāo)志,會(huì) 出現(xiàn)什么情況?結(jié)果是:在用“coutch”;輸出數(shù)組中的字符時(shí),不是輸出讀入的字符串,而是數(shù)組中的全部元素。大家可以親自測(cè)試一下ch[9](即數(shù)組中第10個(gè)元素)的值是什么。
如果輸入↙
abcde
即未讀完第9個(gè)字符就遇到終止字符、讀取操作終止,前5個(gè)字符已存放到數(shù)組ch[0]到ch[4]中,ch[5]中存放'\0'。
如果在get函數(shù)中指定的n為20,而輸入22個(gè)字符,則將輸入流中前19個(gè)字符賦給字符數(shù)組ch中前19個(gè)元素,再加入一個(gè)'\0'。
get函數(shù)中第3個(gè)參數(shù)可以省寫(xiě),此時(shí)默認(rèn)為'\n'。下面兩行等價(jià):
cin.get(ch,10,'\\n');
cin.get(ch,10);
終止字符也可以用其他字符。如
cin.get(ch,10,'x');
在遇到字符'x'時(shí)停止讀取操作。
可以把流看作是一種數(shù)據(jù)的載體,通過(guò)它可以實(shí)現(xiàn)數(shù)據(jù)交換和傳輸。就像水流是一串水組成的 計(jì)算機(jī)中的數(shù)據(jù)流就是由一串?dāng)?shù)據(jù)組成的東西。
C++的輸入輸出流及文件操作
1. C++保留C的輸入輸出單個(gè)字符的函數(shù)
(1) putchar(c) —— 字符輸出
例程:
#include
using namespace std;
int main()
{
char a,b,c;
a='B'; b='O';c='Y';
putchar(a); putchar(b); putchar(c);putchar('/n');
putchar(66);putchar(79);putchar(89);putchar(10); //10是換行的ASCII碼
return 0;
}
(2) getchar() ——字符輸入函數(shù)
例程:
#include
using namespace std;
int main()
{
char c;
c=getchar();
putchar(c+32); //轉(zhuǎn)化為小寫(xiě)字母,大小寫(xiě)之間包括[ / ] ^ - 、6個(gè)字符,因此不加26加32。'A'=65
putchar('/n');
return 0;
}
也可用cout來(lái)輸出: cout(c=getchar()+32);
2. scanf()、printf()函數(shù)的輸入和輸出
scanf(格式控制,輸出表列);
printf(格式控制,輸出表列);
例程:
#include
using namespace std;
int main()
{
int a;
float b;
char c;
scanf("%d % c % f", a,c,b);
printf("a=%d, b=%f, c=%c /n",a,b,c);
return 0;
}
3. 標(biāo)準(zhǔn)輸入輸出流cin、cout
包括頭文件#include
輸入輸出流的控制符要加入頭文件 #include
cout"dec:"
cout.put(97); //顯示a字符--使用cout的成員函數(shù)put(c)
cin成員函數(shù)get()
(1) 不帶參數(shù)的
char c=cin.get(); //用cin的成員函數(shù)get()從鍵盤(pán)讀入一個(gè)字符到c中去
(2) 帶一個(gè)參數(shù)的
cin.get(ch); //從輸入的流中接受一個(gè)字符,并賦給字符變量ch
(3) 帶三個(gè)參數(shù)的
cin.get(字符數(shù)組,字符的個(gè)數(shù)n,終止字符)
例程:
#include
using namespace std;
int main()
{
char ch[20];
cout"in put a string:"
cin.get(ch,10,'/n'); /*取得輸入流的前10-1=9個(gè)字符賦值給ch數(shù)組的前9個(gè)元素,并規(guī)定換行符為為輸入流的終止結(jié)束符*/
cout
return 0;
}
如輸入:1 2 34567890 //按換行鍵終止流輸入
則輸出:1 2 34567 //只讀得前9個(gè)送入ch數(shù)組中
cin的成員函數(shù)getline() ——從輸入流中讀入一行字符
cin.getline(字符數(shù)組(或字符指針),字符的個(gè)數(shù)n,終止字符)
例程:
#include
using namespace std;
int main()
{
char ch[20];
cout"input a string:"
cinch;
cout"The string read with cin is:"
cin.getline(ch,20,'/'); //讀取19個(gè)字符到ch數(shù)組或遇到'/'結(jié)束
cout"The second part is:"
cin.getline(ch,20); //讀取19個(gè)字符到ch數(shù)組或遇到'/n'結(jié)束,遇到'/'仍作為字符讀入
cout"The third part is:"
return 0;
}
istream類(lèi)的其他的成員函數(shù)如:eof(),在輸入流中讀取數(shù)據(jù),如果到達(dá)末尾(遇到文件結(jié)束符),則eof()返回真,否則為假.
例程:
#include
using namespace std;
int main()
{
char c;
while(!cin.eof()) //若未遇到文件結(jié)束符
if((c=cin,get())!=' ') //檢查讀入的字符是否為空格字符
cout.put(c);
return 0;
}
4. 磁盤(pán)文件的打開(kāi)和關(guān)閉
打開(kāi)
ofstream outfile;
if(outfile.open("f1.data",ios::app)==0) // 打開(kāi)
cout"打開(kāi)失敗!";
……………………
outfile.close(); //關(guān)閉
5. 文件寫(xiě)入
#include
#include
#include //一定不能少了,否則報(bào)錯(cuò) error C2679
using namespace std;
int main()
{
string str;
ofstream out("d.txt",ios::out); //等價(jià)于ofstream out("d.txt")
if(!out) //若打開(kāi)失敗,out返回0值
{
cerr"打開(kāi)失?。?
exit(0);
}
str="床前明月光/n疑是地上霜/n舉頭望明月/n低頭思故鄉(xiāng)/n";
out return 0;
}
6. 讀文件到控制臺(tái)
#include
#include
#include
using namespace std;
int main()
{
ifstream infile("d://new//d.txt",ios::in); //定義輸入文件的流對(duì)象,以輸入方式打開(kāi)磁盤(pán)文件d.txt,第二個(gè)參數(shù)可去
if(!infile)
{
cerr"打開(kāi)失?。? exit(1);
}
for(string str;getline(infile,str);) //逐行打開(kāi)并逐行顯示,因此在循環(huán)中實(shí)現(xiàn)
cout infile.close();
return 0;
}
或把 for(string str;getline(in,str);)
cout
兩句改為 string str;
while(getline(in,str))
cout
7. 文件復(fù)制
#include
#include
#include
using namespace std;
int main()
{
ifstream in("d.txt");
if(!in)
{
cerr"打開(kāi)源文件失敗!" exit(1);
}
ofstream out("b.txt");
if(!out)
{
cerr"打開(kāi)目的文件失敗!" exit(1);
}
for(string str;getline(in,str);)
out cout"文件復(fù)制成功!"
in.close();
out.close();
return 0;
}
8. 自定義一個(gè)文件讀入的函數(shù) void display( char *filename)
#include
#include
#include
using namespace std;
void display(char *filename)
{
ifstream infile(filename,ios::in);
if(!infile)
{
cerr"打開(kāi)失??!" exit(1);
}
char ch;
while(infile.get(ch))
cout.put(ch);
cout infile.close();
}
int main()
{
display("d.txt");
return 0;
}
9.關(guān)于文件讀寫(xiě)的綜合應(yīng)用
#include
#include
using namespace std;
//從鍵盤(pán)讀入字母并存入文件“d.txt”中
void save_to_file()
{
ofstream ofile("d.txt");
if(!ofile)
{
cerr"打開(kāi)失敗d.txt!" exit(1);
}
char c[80];
cin.getline(c,80); //從鍵盤(pán)逐個(gè)讀入一行字符
for(int i=0;c[i]!=0;i++) //對(duì)字符逐個(gè)處理,知道遇到'/n'結(jié)束
if(c[i]=65 c[i]=90||c[i]=97 c[i]=122)
{
ofile.put(c[i]); //將字母存入磁盤(pán)文件d.txt
cout }
cout ofile.close();
}
//將"d.txt"中的字母轉(zhuǎn)化為大寫(xiě)字母并存入"out.txt"中
void get_from_file()
{
char ch;
ifstream infile("d.txt");
if(!infile)
{
cerr"打開(kāi)失敗d.txt!" exit(1);
}
ofstream outfile("out.txt");
if(!infile)
{
cerr"打開(kāi)失敗out.txt!" exit(1);
}
while(infile.get(ch)) //逐個(gè)讀入字符成功后執(zhí)行下面的語(yǔ)句
{
if(ch=97 ch=122)
ch=ch-32;
outfile.put(ch);
cout }
cout infile.close();
outfile.close();
}
int main()
{
save_to_file();
get_from_file();
return 0;
}
=========================== C/C++的字符或字符數(shù)組的讀入函數(shù)總結(jié)=====================
1、cin
1、cin.get()
2、cin.getline()
3、getline()
4、gets()
5、getchar()
1、cin
用法1:最基本,也是最常用的用法,輸入一個(gè)數(shù)字:
#include
using namespace std;
main ()
{
int a,b;
cinab;
cout}
輸入:2[回車(chē)]3[回車(chē)]
輸出:5
用法2:接受一個(gè)字符串,遇“空格”、“TAB”、“回車(chē)”都結(jié)束
#include
using namespace std;
main ()
{
char a[20];
cina;
cout}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkljkl jkljkl //遇空格結(jié)束
輸出:jkljkl
2、cin.get()
用法1: cin.get(字符變量名)可以用來(lái)接收字符
#include
using namespace std;
main ()
{
char ch;
ch=cin.get(); //或者cin.get(ch);
cout}
輸入:jljkljkl
輸出:j
用法2:cin.get(字符數(shù)組名,接收字符數(shù)目)用來(lái)接收一行字符串,可以接收空格
#include
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout}
輸入:jkl jkl jkl
輸出:jkl jkl jkl
輸入:abcdeabcdeabcdeabcdeabcde (輸入25個(gè)字符)
輸出:abcdeabcdeabcdeabcd (接收19個(gè)字符+1個(gè)'/0')
3、cin.getline() // 接受一個(gè)字符串,可以接收空格并輸出
getline 會(huì)將換行符替換為空字符
#include
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout}
輸入:jkljkljkl
輸出:jklj
接受5個(gè)字符到m中,其中最后一個(gè)為'/0',所以只看到4個(gè)字符輸出;
如果把5改成20:
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jklf fjlsjf fjsdklf
輸出:jklf fjlsjf fjsdklf
//延伸:
//cin.getline()實(shí)際上有三個(gè)參數(shù),cin.getline(接受字符串的看哦那間m,接受個(gè)數(shù)5,結(jié)束字符)
//當(dāng)?shù)谌齻€(gè)參數(shù)省略時(shí),系統(tǒng)默認(rèn)為'/0'
//如果將例子中cin.getline()改為cin.getline(m,5,'a');當(dāng)輸入jlkjkljkl時(shí)輸出jklj,輸入jkaljkljkl時(shí),輸出jk
當(dāng)用在多維數(shù)組中的時(shí)候,也可以用cin.getline(m[i],20)之類(lèi)的用法:
#include
#include
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i3;i++)
{
cout"/n請(qǐng)輸入第"cin.getline(m[i],20);
}
coutfor(int j=0;j3;j++)
cout"輸出m["
}
請(qǐng)輸入第1個(gè)字符串:
kskr1
請(qǐng)輸入第2個(gè)字符串:
kskr2
請(qǐng)輸入第3個(gè)字符串:
kskr3
輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3
4、getline() // 接受一個(gè)字符串,可以接收空格并輸出,需包含“#include”
#include
#include
using namespace std;
main ()
{
string str;
getline(cin,str);
cout}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jfksldfj jklsjfl
輸出:jkl jfksldfj jklsjfl
和cin.getline()類(lèi)似,但是cin.getline()屬于istream流,而getline()屬于string流,是不一樣的兩個(gè)函數(shù)
5、gets() // 接受一個(gè)字符串,可以接收空格并輸出,需包含“#include”
#include
#include
using namespace std;
main ()
{
char m[20];
gets(m); //不能寫(xiě)成m=gets();
cout}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jkl jkl
輸出:jkl jkl jkl
類(lèi)似cin.getline()里面的一個(gè)例子,gets()同樣可以用在多維數(shù)組里面:
#include
#include
using namespace std;
main ()
{
char m[3][20];
for(int i=0;i3;i++)
{
cout"/n請(qǐng)輸入第"gets(m[i]);
}
coutfor(int j=0;j3;j++)
cout"輸出m["
}
請(qǐng)輸入第1個(gè)字符串:
kskr1
請(qǐng)輸入第2個(gè)字符串:
kskr2
請(qǐng)輸入第3個(gè)字符串:
kskr3
輸出m[0]的值:kskr1
輸出m[1]的值:kskr2
輸出m[2]的值:kskr3
自我感覺(jué)gets()和cin.getline()的用法很類(lèi)似,只不過(guò)cin.getline()多一個(gè)參數(shù)罷了;
這里順帶說(shuō)明一下,對(duì)于本文中的這個(gè)kskr1,kskr2,kskr3 的例子,對(duì)于cin也可以適用,原因是這里輸入的沒(méi)有空格,如果輸入了空格,比如“ks kr jkl[回車(chē)]”那么cin就會(huì)已經(jīng)接收到3個(gè)字符串,“ks,kr,jkl”;再如“kskr 1[回車(chē)]kskr 2[回車(chē)]”,那么則接收“kskr,1,kskr”;這不是我們所要的結(jié)果!而cin.getline()和gets()因?yàn)榭梢越邮湛崭瘢圆粫?huì)產(chǎn)生這個(gè)錯(cuò)誤;
6、getchar() //接受一個(gè)字符,需包含“#include”
#include
#include
using namespace std;
main ()
{
char ch;
ch=getchar(); //不能寫(xiě)成getchar(ch);
cout}
輸入:jkljkljkl
輸出:j
//getchar()是C語(yǔ)言的函數(shù),C++也可以兼容,但是盡量不用或少用;
總結(jié):
1.讀入一行
gets(char a[]); //接受一行,遇回車(chē)結(jié)束
gets(m[i]) //可用于多維數(shù)組中
cin.get(char a[],int 5,'/n') //將字符數(shù)組a的前5個(gè)字符讀入,遇到換行符結(jié)束;比如:a bc12ds,將會(huì)讀入4個(gè)字符 a bc,外加一個(gè)'/0';
// 一般第三個(gè)參數(shù)不寫(xiě),默認(rèn)為'/0'
eg:
#include
#include
using namespace std;
main ()
{
string str;
getline(cin,str);
cout}
2.讀入一個(gè)字符
getchar() //接受一個(gè)字符,需包含“#include”
char ch =getchar();
cin.get(char c) 或者 cin.get()
char ch=cin.get(); 或者cin.get(ch)
getline()和cin.getline()類(lèi)似,但是cin.getline()屬于istream流,而getline()屬于string流,是不一樣的兩個(gè)函數(shù)
cin.getline(char a[],int 5,'/n') //將字符數(shù)組a的前5個(gè)字符讀入,遇換行符結(jié)束;如:a bc12ds,將會(huì)讀入4個(gè)字符 a bc,外加一個(gè)'/0';
// 一般第三個(gè)參數(shù)不寫(xiě),默認(rèn)為'/0'
cin.getline(m[i],20) //可用于多維數(shù)組中
getline() // 接受一個(gè)字符串,可以接收空格并輸出,需包含“#include"
C語(yǔ)言中stdin流的用法:
stdin是C語(yǔ)言中標(biāo)準(zhǔn)輸入流,一般用于獲取鍵盤(pán)輸入到緩沖區(qū)里的東西。
訪問(wèn)stdin,可用stdio.h中提供的以下幾個(gè)函數(shù):
(1)scanf、getchar來(lái)從stdin流中獲取指定的數(shù)據(jù)。scanf根據(jù)第一個(gè)參數(shù)指定的格式符將數(shù)據(jù)讀入后續(xù)參數(shù)指定的內(nèi)存位置中;getchar從stdin流中讀取一個(gè)字符并返回。
(2)可以使用一般的訪問(wèn)輸入流的函數(shù)來(lái)訪問(wèn)stdin,比如:fscanf、fgetc,使用方法和scanf、getchar類(lèi)似,只是多了一個(gè)參數(shù)指定文件流。當(dāng)然,scanf和getchar的具體實(shí)現(xiàn)就是通過(guò)調(diào)用fscanf和fgetc,這樣可以提高代碼利用率。
(3)可以用fflush和rewind這兩個(gè)函數(shù)來(lái)刷新stdin,來(lái)清空緩沖區(qū)中已有的內(nèi)容,不過(guò)這種方法不是標(biāo)準(zhǔn)方法,當(dāng)stdin被重定向到文件時(shí),這會(huì)導(dǎo)致指針重新指向文件開(kāi)頭。
C語(yǔ)言從stdin讀取一行字符串的方法如下:
gets
gets函數(shù)的頭文件是stdio.h,原型如下:
char *gets(char *s);
gets從stdin中讀入一行內(nèi)容到s指定的buffer中,當(dāng)遇到換行符或EOF時(shí)讀取結(jié)束。讀取成功時(shí),返回s地址;失敗時(shí)返回null。需要注意的是,gets會(huì)將行末尾的'\n'字符或EOF替換成'\0',這樣,gets讀取的內(nèi)容中不包括'\n'字符。如果要獲取讀取字符串的長(zhǎng)度,可以調(diào)用strlen函數(shù)獲得。
fgets
fgets函數(shù)的頭文件是stdio.h,原型如下:
char *fgets(char *s, int size, FILE*stream);
fgets從stream中讀取最多size-1大小的內(nèi)容到s指定的buffer中,當(dāng)遇到換行符或EOF時(shí)讀取結(jié)束。讀取成功時(shí),返回s地址;失敗時(shí)返回null。需要注意的是,fgets會(huì)在所讀取的內(nèi)容后面添加'\0',這樣,fgets讀取的內(nèi)容中會(huì)包括行末尾的'\n'字符。如果要獲取讀取字符串的長(zhǎng)度,可以調(diào)用strlen函數(shù)獲得。
getline
getline函數(shù)的頭文件是stdio.h,原型如下:
ssize_t getline(char **lineptr,size_t *n, FILE *stream);
getline從stream中讀取一行內(nèi)容到*lineptr所指定的buffer中,當(dāng)遇到換行符或EOF時(shí)讀取結(jié)束。*n是*lineptr所指定的buffer的大小,如果*n小于讀入的內(nèi)容長(zhǎng)度,getline會(huì)自動(dòng)擴(kuò)展buffer長(zhǎng)度,并更新*lineptr和*n的值。讀取成功時(shí),返回讀入的字符個(gè)數(shù);失敗時(shí)返回-1。需要注意的是,gelines讀取的內(nèi)容中會(huì)包括行末尾的'\n'字符。
C語(yǔ)言輸入輸出函數(shù)有很多,bai標(biāo)準(zhǔn)I/O函數(shù)du中包含了如下幾個(gè)常用的函數(shù):
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
int scanf(const char *format, arg_list)
scanf主要從標(biāo)準(zhǔn)zhi輸入流中獲取dao參數(shù)值,format為指定的參數(shù)格式及參數(shù)類(lèi)型,如scanf("%s,%d",str,icount);
它要求在標(biāo)準(zhǔn)輸入流中輸入類(lèi)似"son of bitch,1000"這樣的字符串,同時(shí)程序會(huì)將"son of bitch"給str,1000給icount.
scanf函數(shù)的返回值為int值,即成功賦值的個(gè)數(shù),在上例中如果函數(shù)調(diào)用成功,則會(huì)返回2,所以我們?cè)趯?xiě)程序時(shí),可以通過(guò)
語(yǔ)句if(scanf("%s,%d",str,icount) != 2){...}來(lái)判斷用戶輸入是否正確.
int printf(const char *format, arg_list)
printf主要是將格式化字符串輸出到標(biāo)準(zhǔn)輸出流中,在stdio.h頭文件中定義了標(biāo)準(zhǔn)的輸入和輸出,分別是stdin,stdout.
arg_list可以是變量名,也可以是表達(dá)式,但最終都會(huì)以值的形式填充進(jìn)format中.
int getc(FILE *fp)
getc主要是從文件中讀出一個(gè)字符.常用的判斷文件是否讀取結(jié)束的語(yǔ)句為:(ch = getc(fp)) != EOF.EOF為文件結(jié)束標(biāo)志,
定義在stdio.h中,就像EXIT_SUCCESS,EXIT_FAILURE定義在stdlib.h中一樣,文件也可以被理解為一種流,所以當(dāng)fp為stdin
時(shí),getc(stdin)就等同于getchar()了.
int putc(int ch,FILE *fp)
putc主要是把字符ch寫(xiě)到文件fp中去.如果fp為stdout,則putc就等同于putchar()了.
int getchar(void)
getchar主要是從標(biāo)準(zhǔn)輸入流讀取一個(gè)字符.默認(rèn)的標(biāo)準(zhǔn)輸入流即stdio.h中定義的stdin.但是從輸入流中讀取字符時(shí)又
涉及到緩沖的問(wèn)題,所以并不是在屏幕中敲上一個(gè)字符程序就會(huì)運(yùn)行,一般是通過(guò)在屏幕上敲上回車(chē)鍵,然后將回車(chē)前的字符
串放在緩沖區(qū)中,getchar就是在緩沖區(qū)中一個(gè)一個(gè)的讀字符.當(dāng)然也可以在while循環(huán)中指定終止字符,如下面的語(yǔ)句:
while ((c = getchar()) != '#')這是以#來(lái)結(jié)束的.
int putchar(int ch)
putchar(ch)主要是把字符ch寫(xiě)到標(biāo)準(zhǔn)流stdout中去.
char * gets(char *str)
gets主要是從標(biāo)準(zhǔn)輸入流讀取字符串并回顯,讀到換行符時(shí)退出,并會(huì)將換行符省去.
int puts(char *str)
puts主要是把字符串str寫(xiě)到標(biāo)準(zhǔn)流stdout中去,并會(huì)在輸出到最后時(shí)添加一個(gè)換行符.
char *fgets(char *str, int num, FILE *fp)
str是存放讀入的字符數(shù)組指針,num是最大允許的讀入字符數(shù),fp是文件指針.fgets的功能是讀一行字符,該行的字符數(shù)
不大于num-1.因?yàn)閒gets函數(shù)會(huì)在末尾加上一個(gè)空字符以構(gòu)成一個(gè)字符串.另外fgets在讀取到換行符后不會(huì)將其省略.
int fputs(char *str, file *fp)
fputs將str寫(xiě)入fp.fputs與puts的不同之處是fputs在打印時(shí)并不添加換行符.
int fgetc(FILE *fp)
fgetc從fp的當(dāng)前位置讀取一個(gè)字符.
int fputc(int ch, file *fp)
fputc是將ch寫(xiě)入fp當(dāng)前指定位置.
int fscanf(FILE *fp, char *format,...)
fscanf按照指定格式從文件中出讀出數(shù)據(jù),并賦值到參數(shù)列表中.
int fprintf(FILE *fp, char *format,...)
fprintf將格式化數(shù)據(jù)寫(xiě)入流式文件中.