}
dec:
21
hex:
0x15
oct:
025
China
*****China
pi=*3.142857e+000
+***3.142857
13.2.3用流成员函数put输出字符
put是用于输出单个字符的成员函数。
cout.put('a');
cout.put(65+32);
例13.4有一个字符串”BASIC”,要求把它按相反的顺序输出。
#include
usingnamespacestd;
intmain()
{char*a="BASIC";
for(inti=4;i>=0;i--)
cout.put(*(a+i));
cout.put('\n');
return0;
}
也可以用putchar函数实现。
#include
intmain()
{char*a="BASIC";
for(inti=4;i>=0;i--)
putchar(*(a+i));
putchar('\n');
return0;
}
13.3标准输入流
13.3.1cin流
可以通过测试cin的值,判断流对象是否处于正常状态和提取操作是否成功。
if(!
cin)
cerr<<"error";
例13.5通过测试cin的值,判断流对象是否处于正常状态。
#include
usingnamespacestd;
voidmain()
{
floatgrade;
cout<<"entergrade:
";
while(cin>>grade)
{if(grade>=85)cout<"<if(grade<60)cout<"<cout<<"entergrade:
";
}
cout<<"Theend."<}
entergrade:
67
entergrade:
89
89GOOD!
entergrade:
56
56fail!
entergrade:
100
100GOOD!
entergrade:
w
Theend.
13.3.2用于字符输入的流成员函数
1.用get函数读入一个字符
(1)不带参数的get函数
cin.get();
用来从指定的输入流中提取一个字符(包括空白字符),函数返回值就是读入的字符。
若遇到文件结束符CTRL+Z,
则函数返回文件结束标志EOF(EndOfFile),一般以-1代表EOF。
例13.6用get函数读入字符。
#include
usingnamespacestd;
voidmain()
{charc;
cout<<"enterasentence:
"<while((c=cin.get())!
=EOF)
cout.put(c);
}
enterasentence:
IstudyC++veryhard.
IstudyC++veryhard.
(2)有一个参数的get函数
cin.get(ch);
其作用是从输入流中读取一个字符,赋给字符变量ch。
读取成功返回真,失败(遇到文件结束符等)返回假。
#include
usingnamespacestd;
voidmain()
{charc;
cout<<"enterasentence:
"<while(cin.get(c))
{cout.put(c);}
cout<<"end"<}
(3)有三个参数的get函数
cin.get(字符指针,字符个数n,终止字符)
其作用是从输入流中读取n-1个字符,赋值个指定的字符指针指向的地方。
如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。
如果读取成功则函数返回非0(真),如失败(遇到文件结束符)返回0(假)。
#include
usingnamespacestd;
voidmain()
{charch[20];
cout<<"enterasentence:
"<cin.get(ch,10,'\n');
cout<}
enterasentence:
IstudyC++veryhard.
IstudyC
get函数的第三个参数可以省略,此时默认为’\n’。
2.用成员函数getline函数读入一行字符
getline成员函数的作用是从输入流中读取一行字符,其用法与带三个参数的get函数类似。
例13.7用getline函数读入一行字符。
#include
usingnamespacestd;
voidmain()
{charch[20];
cout<<"enterasentence:
"<cin>>ch;
cout<<"Thestringreadwithcinis:
"<cin.getline(ch,20,'/');
cout<<"Thesecondpartis:
"<cin.getline(ch,20);
cout<<"Thethirdpartis:
"<}
enterasentence:
IlikeC++./IstudyC++./Iamhappy.
Thestringreadwithcinis:
I
Thesecondpartis:
likeC++.
Thethirdpartis:
IstudyC++./Iamh
下一个getline函数将从该终止标志的下一个字符开始读入。
13.3.3istream类的其他成员函数
1.eof函数
从输入流中读取数据,如果到达文件末尾,eof函数值为真,否则为假。
例13.8逐个读入一行字符,将其中的非空格字符输出。
#include
usingnamespacestd;
voidmain()
{charc;
while(!
cin.eof())
if((c=cin.get())!
='')
cout.put(c);
}
C++isveryinteresting.
C++isveryinteresting.
2.peek函数
c=cin.peek();
函数的返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。
3.putback函数
cin.putback(ch);
其作用是将前面用get或getline函数从输入流中读取的字符返回到输入流,插到当前指针位置,以供后面读取。
例13.9peek函数和putback函数的用法。
#include
usingnamespacestd;
voidmain()
{charc[20];
intch;
cout<<"pleaseenterasentence."<cin.getline(c,15,'/');
cout<<"Thefirstpartis:
"<ch=cin.peek();
cout<<"Thenextcharacter(ASCIIcode)is:
"<cin.putback(c[0]);
cin.getline(c,15,'/');
cout<<"Thesecondpartis:
"<}
pleaseenterasentence.
Iamaboy./amastudent./
Thefirstpartis:
Iamaboy.
Thenextcharacter(ASCIIcode)is:
32
Thesecondpartis:
Iamastudent
图13.4
4.ignore函数
cin.ignore(n,终止字符)
函数的作用是跳过输入流中的n个字符,或遇到指定的终止字符时提前结束。
ignore(5,’A’);
//跳过输入流中的5个字符,遇到‘A’后提前结束。
ignore();相当于ignore(1,EOF);
例13.10用ignore函数跳过输入流中的字符。
不用ignore函数的情况。
#include
usingnamespacestd;
voidmain()
{charch[20];
cin.get(ch,20,'/');
cout<<"Thefirstpartis:
"<cin.get(ch,20,'/');
cout<<"Thesecondpartis:
"<}
IlikeC++./IstudyC++./Iamhappy.
Thefirstpartis:
IlikeC++.
Thesecondpartis:
#include
usingnamespacestd;
voidmain()
{charch[20];
cin.get(ch,20,'/');
cout<<"Thefirstpartis:
"<cin.ignore();
cin.get(ch,20,'/');
cout<<"Thesecondpartis:
"<}
IlikeC++./IstudyC++./Iamhappy.
Thefirstpartis:
IlikeC++.
Thesecondpartis:
IstudyC++.
13.4文件操作与文件流
13.4.1文件的概念
文件:
一般是存储在外部介质(硬盘,光盘,U盘)上的数据的集合。
ASCII文件:
它的每一个字节放一个ASCII代码,代表一个字符,也称文本文件。
用于存储字符信息。
二进制文件:
是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
例如整数100000
图13.5
13.4.2文件流类与文件流对象
文件流是以外存文件为输入输出对象的数据流。
输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。
每一个文件流都有一个内存缓冲区与之对应。
用于文件操作的文件流类:
ifstream类,是从istream类派生的。
用来读磁盘文件。
ofstream类,是从ostream类派生的。
用来写磁盘文件。
fstream类,是从iostream类派生的。
用来读、写磁盘文件。
ofstreamoutfile;//建立一个输出文件流对象。
13.4.3文件的打开与关闭
1.打开磁盘文件
(1)调用文件流成员函数open。
ofstreamoutfile;//建立一个输出文件流对象。
outfile.open("f1.dat",ios:
:
out);
使输出文件流outfile与f1.dat文件建立关联,此时f1.dat是一个输出文件,用于接收从内存输出的数据。
调用成员函数open的一般格式为:
文件流对象.open(磁盘文件名,输入输出方式);
(2)在定义文件流时指定参数
ofstreamoutfile("f1.dat",ios:
:
out);
作用与open函数相同。
说明:
(1)新版本I/O类库中不提供ios:
:
nocreate和ios:
:
noreplace。
(2)每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式决定,每次读写都从文件指针的当前位置开始。
每读入一个字节,指针就后移一个字节。
当文件指针移到最后,就会遇到文件结束符CTRL+Z,此时一般返回EOF(值为-1)。
此时流对象的成员函数eof的值为真,表示文件结束了。
(3)可以用“位或”运算符“|”对输出方式进行组合。
ios:
:
in|ios:
:
nocreate
(4)如果打开操作失败,open函数的返回值为0(假),如果是调用构造函数的方式打开文件的,则流对象的值为0。
可以据此判断打开是否成功。
if(outfile.open("f1.dat",ios:
:
app)==0)
cout<<"openerror";
if(!
outfile.open("f1.dat",ios:
:
app))
cout<<"openerror";
2.关闭磁盘文件
关闭文件的成员函数close。
outfile.close();
所谓的关闭,就是解除该磁盘文件与文件流对象的关联。
此时,该文件流对象就可以和其它磁盘文件关联。
13.4.4对ASCII文件的操作
对ASCII文件的读写操作可以用以下两种方法:
(1)用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。
(2)用流的成员函数put,get,getline等进行输入和输出。
例13.11有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件中存放。
#include
#include
usingnamespacestd;
voidmain()
{inta[10];
ofstreamoutfile("f1.dat");
//ofstreamoutfile("f1.dat",ios:
:
out);
if(!
outfile)
{cerr<<"openerror!
"<exit
(1);
}
cout<<"enter10integernumbers:
"<for(inti=0;i<10;i++)
{cin>>a[i];outfile<outfile.close();
}
enter10integernumbers:
13524610879
例13.12从例13.11建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。
#include
#include
usingnamespacestd;
voidmain()
{inta[10],max,i,order;
ifstreaminfile("f1.dat",ios:
:
in);
if(!
infile)
{cerr<<"openerror!
"<(1);}
for(i=0;i<10;i++)
{infile>>a[i];cout<cout<max=a[0];
order=0;
for(i=1;i<10;i++)
if(a[i]>max)
{max=a[i];order=i;}
cout<<"max="<infile.close();
}
13524610879
max=10
order=6
例13.13从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。
再把它从磁盘文件读入程序,将其中的小写字母改写为大写字母,再存入磁盘文件f3.dat。
#include
#include
usingnamespacestd;
voidsave_to_file()
{ofstreamoutfile("f2.dat");
if(!
outfile)
{cerr<<"openf2.daterror!
"<(1);}
charc[80];
cin.getline(c,80);
for(inti=0;c[i];i++)
if(c[i]>=65&&c[i]<=90||c[i]>=97&&c[i]<=122)
{outfile.put(c[i]);cout<cout<outfile.close();
}
voidget_from_file()
{charch;
ifstreaminfile("f2.dat",ios:
:
in);
if(!
infi