第6章IO流Word文件下载.docx
- 文档编号:17844221
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:15
- 大小:22.20KB
第6章IO流Word文件下载.docx
《第6章IO流Word文件下载.docx》由会员分享,可在线阅读,更多相关《第6章IO流Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
fstream
I/O文件流类
strstream
I/O字符串流类
stdiostream
标准I/O文件的I/O类
stdiostr.h
图6.1I/O流类层次图
6.1.1标准的设备名
在C++中,<
iostream.h>
头文件是I/O流的标准头文件,其对应的标准设备如表6.2所示。
表6.2标准的I/O流设备
C++名字设备默认的含义
cin
键盘
标准输入
cout
屏幕
标准输出
cerr
标准错误输出(不带缓冲)
clog
打印机
标准错误输出(带缓冲)
6.1.2原理
在C++中我们用得最多的输出语句是cout。
cout是ostream流类的对象,它在iostream.h头文件中作为全局对象定义:
ostreamcout(stdout);
//标准设备名作为其构造时的参数
ostream流类对应的每个基本数据类型都有友元,它们在头文件<
ostream.h>
中的声明如下:
ostream&
operator<
<
(ostream&
dest,char*pSource);
dest,intsource);
dest,doublesource);
……
比如C++程序输出语句:
cout<
”Mynameisxiaoming”<
endl;
其中cout是ostream的对象,“<
”是操作符,右面是char*类型。
匹配上面的“ostream&
operator<
dest,char*pSource);
”操作符。
它的功能是输出整个字符串,并返回ostream流对象的引用。
endl(行结束符)是流控制符,实现转义序列“\n”(换行符)的功能,并刷新输出缓冲区(不管输出缓冲区是否已满)。
和cout一样,cin是istream的全局对象,“>
>
”是操作符。
除了标准输入输出设备,还有标准的错误输出设备cerr。
当程序测试并处理关键错误时,如果不希望程序的错误信息从屏幕显示重定向到其他地方,则可以使用cerr流显示信息。
注意:
写到cerr上的信息是不能被重定向的,它只能输出到屏幕。
6.2文件流类
ofstream、ifstream和fstream是文件流类,在fstream.h中定义,其中fstream是ofstream和ifstream多重继承的子类。
文件流类不是标准设备,所以没有cout那样预先定义的全局对象。
文件流类定义的操作应用于外部设备,其中用得最多的设备是磁盘中的文件。
要定义一个流类文件,必须定义文件名和打开方式。
类ofstream用于执行文件输出,它有好几个构造函数,其中用得最多的是:
ofstream:
:
ofstream(char*pFileName,
intmode=ios:
out,
intprot=filebuf:
openprot);
它有3个参数,第一个参数指向要打开的文件名,第二个和第三个参数说明文件如何被打开,prot是文件共享方式,可选项如表6.3所示:
mode是文件打开模式,可选项如表6.4所示。
表6.3prot共享方式选项
filebuf:
openprot兼容共享方式
sh_none独占,不共享
sh_read允许读共享
sh_write允许写共享
表6.4mode打开模式选项
ios:
ate如果文件存在,输出内容加在文件末尾
in具有输入功能(ifstream默认)
out具有输出功能(ofstream默认)
trunc如果文件存在,清除文件内容
nocreate如果文件不存在,返回错误
noreplace如果文件存在,返回错误
binary以二进制方式打开文件
也可以用成员函数open打开文件,它的定义是:
voidopen(constchar*szName,
intnMode=ios:
intnProt=filebuf:
openprot);
例如:
向文件myfile中写入一些信息,如果文件不存在,则创建该文件。
代码如下:
//构造对象时打开文件(li6_2.cpp)
#include<
fstream.h>
voidmain()
{
ofstreamfout("
e:
\\temp\\myfile.txt"
);
fout<
"
thisisaC++program."
endl;
}
//使用成员函数open打开文件(li6_1.cpp)
ofstreamfout;
fout.open("
文件名中要说明路径,其中斜杠要双写,因为编译器理解下的斜杠是转义字符。
在删除对象时,析构函数会关闭由构造函数或open成员函数打开的文件。
程序执行成功后,打开文件myfile,就可看到“thisisaC++program.”已经写入文件。
下面向文件myfile中添加一些信息。
//构造对象时打开文件(li6_3.cpp)
voidmain()
ofstreamfadd("
ios:
ate);
fadd<
anewfile"
//使用成员函数open打开文件(li6_4.cpp)
ios:
程序执行结果是将“anewfile”添加到文件myfile的尾部,该文件的内容变为“thisisaC++programanewfile”。
6.3串流类
ostrstream、istrstream和strstream是串流类,在strstream.h中定义。
其中,strstream是ostrstream和istrstream多重继承的子类。
串流类也不是标准设备,所以没有像cout和cin那样预先定义的全局对象。
串流类允许将fstream类定义的文件操作应用于存储区中的字符串,即将字符串看成设备。
要定义一个串流对象,需定义字符数组和数组的大小。
类istrstream用于执行串流输入,它的常用构造函数是:
istrstream(char*pch,intnLength);
第一个参数指向字符串数组,第二个参数说明数组的大小。
当nLength为0时,表示把istrstream类对象连接到由str指向的以空字符串结束的字符串。
charstr[10]={"
student"
};
chara[5];
istrstreamai(str,sizeof(a)-1);
ai>
a;
类ostrstream用于串流输出,常用的一个构造函数是:
ostrstream(char*pch,intnLength,intnMode=ios:
out);
其中:
●pch:
字符串数组。
●nLength:
数组大小。
当字符个数超过nLength时,字符串不再接受输出。
●nMode:
打开方式。
例如向字符数组中写入字符串:
(li6_8.cpp)
strstrea.h>
charstr[10];
ostrstreamaout(str,sizeof(str));
//采用默认的ios:
out输出方式
aout<
astudent"
cout<
str<
下面的程序使用串流输入对字符串数据进行操作:
#include<
char*ps(char*pString)
{
istrstreamin(pString,0);
inta;
floatb;
in>
a>
b;
char*pBuf=newchar[1024];
ostrstreamout(pBuf,1024);
out<
a="
a<
,b="
b<
returnpBuf;
}
voidmain()
char*s="
10001000.5"
;
char*pbuffer=ps(s);
pbuffer<
deletel[]pbuffer;
输出结果是:
a=1000,b=1000.5
6.4C++控制输出
C++有两种方式控制格式输出,一种是用流对象的成员函数,另一种是用格式控制字符。
6.4.1用流对象成员函数控制输出格式
C++控制格式输出的流对象的成员函数主要有以下几种,如表6.5所示。
表6.5流对象成员函数
函数功能
flags(10)置基数为10
flags(16)置基数为16
flags(8)置基数为8
fill(c)设置填充字符为c
precision(n)设置显示小数精度为n位
width(n)设置域宽为n个字符
(li6_6.cpp)
cout.fill('
*'
cout.width(10);
cout.precision(6);
1234.56789<
cout.width(16);
cout.precision(8);
'
cout.width(8);
cout.precision(4);
程序的执行结果是:
***1234.57
*******1234.5679
1235
6.4.2用控制符控制输出格式
C++控制格式输出的格式控制符有以下几种,如表6.6所示。
表6.6控制输出格式的控制符
控制符
功能
dec
hex
oct
setfill(c)
setprecision(n)
setw(n)
置基数为10
置基数为16
置基数为8
设置填充字符为c
设置显示小数精度为n位
设置域宽为n个字符
下面的代码完成和上面的程序同样的功能:
iomanip.h>
setfill('
)
<
setw(10)
setprecision(6)
setw(16)
setprecision(8)
setw(8)
setprecision(4)
6.5I/O成员函数
大多数简单的C++程序使用cin进行输入操作。
如果需要对输入操作进行更加精细的控制,可以使用I/O流成员函数。
6.5.1文件输入流类的成员函数
1.getline()函数
程序使用cin输入时,cin用空白符和结束符将每个值分开。
为了读取整行文本(包含空格),可以使用getline()成员函数,其函数原型为:
getline(char*line,intsize,char='
\n'
);
其中第一个参数是字符数组,用于放置读取的文本;
第二个参数是本次读取的最大字符个数;
第三个参数是分隔字符,作为一行结束的标志。
例如,下面的函数完成从键盘读取一行文本的功能。
voidfn()
charstr[128];
TypeinalineOftextandpressEnter"
cin.getline(str,sizeof(str));
Youtyped:
在默认状态下,gefline成员函数读字符直到遇见回车,或者读到指定字符数。
如果需要遇到某个字符(比如字母“Y”)时,结束输入操作,可以使用以下方式:
cin.getline(1ine,sizeof(1ine),'
Y'
“cin.getline()”和“cin>
str”的不同点是:
前者输入一行,行中可以包含空格;
后者却以空格或者回车作为字符串结束标志,不包含空格。
2.get()函数
get()成员函数可以实现每次输入一个字符的目的,并且get()不跳过空格。
chara[10];
inti=0;
ifstreamfin("
\\temp\\myfile5.txt"
while((!
fin.eof())&
&
(i<
10))
a[i]=fin.get();
//输入带空格,或用fin>
a[i];
自动过滤空格
i++;
3.read()函数
read函数可以实现无格式输入,它可以把一定数量的字节写入字符数组。
这些字节都是未经任何格式化的,仅仅以原始的数据形式输入。
函数原型为:
istream&
read(char*pch,intnCount);
//从文件读nCount个字节到指定的存储区。
chard[100];
fin.read(d,20);
d[20]='
\0'
;
d<
4.seekg()和tellg()函数
在输入文件流中,保留着一个内部指针,指向文件中下一个将读数据的位置。
可以用seekg函数来设置这个指针。
tellg函数返回当前文件读指针的位置,这个指针是streampos类型。
这两个成员函数的原型是:
istream:
seekg(<
流中的位置>
偏移量>
<
参照位置>
streamposistream:
tellg();
下面的函数实现了从流中间隔读入字符的功能:
while(!
fin.eof()){
pos=fin.tellg();
pos++;
fin.seekg(pos);
fin.get(d[i]);
i++;
6.5.2文件输出流类的成员函数
1.put函数
put函数把一个字符写到输出流中,函数原型为:
put(charch);
fout.put('
A'
)<
//精确地输入一个字符,宽度和填充方式不起作用
setw(10)<
'
//输出一个字符,宽度和填充方式起作用
setw(10);
cout.put('
//精确地输入一个字符,宽度和填充方式不起作用
则输出结果是:
a
---------a
2.write函数
write函数把内存中的一块内容写到输出文件流中,长度参数指出写的字节数。
write函数的原型是:
ostream&
write(constchar*pch,
intnCount);
其中:
pch:
内存数据起始地址
nCount:
字节数
例如,下面的程序建立了一个输出文件流,并将Date结构的二进制值写入文件:
structDate
intm,d,y;
};
Datedt={8,11,1974};
ofstreammyfile("
,ios:
binary);
myfile.write((char*)&
dt,sizeofdt);
write函数当遇到空字符时并不停止,因此能够写入完整的类结构,该函数带两个函量:
一个char指针(指向内存数据的起始地址)和一个所写的字节数。
注意在该结构对象的地址之前需要用“char'
’做强制类型转换。
3.seekp和tellp函数
在输出文件流中,保存着一个内部指针,指出下一次写数据的位置,seekp成员函数用于设置这个指针,因此可以以随机的方式向磁盘输出。
tellp成员函数返回当前文件写指针的位置。
seekp成员函数的原型为:
seekp(streampospos);
seekp(streamoffoff,ios:
seek_dirdir);
●pos:
长整形,指针的新位置
●off:
长整形,指针的偏移量
●dir:
相对位置:
◆ios:
beg文件头
cur文件指针的当前位置
end文件尾
tellp成员函数的原型为:
streampostellp();
fout.seekp(10);
//从文件头部向后移动10个字节
10"
intpos;
pos=fout.tellp();
pos=pos+2;
fout.seekp(pos);
//从当前位置向后移动2个字节
12"
4.close函数
close成员函数关闭一个与输出文件相关的磁盘文件。
文件使用完毕后必须将其关闭以完成磁盘输出。
虽然ostream析构函数会自动完成关闭,但如果需要在同一个流对象上打开另外的文件,就需要使用close函数。
ofstreamfout;
file1"
……
fout.close();
file2"
5.错误处理函数
错误处理函数的作用是在写入一个流时进行错误处理。
这些函数包括:
●bad:
出现严重的不可恢复的错误,返回非0值
●fail:
出现任何I/O错误(不是文件结束),返回非0值
●good:
没有错误,没有文件结束,返回非0值
●eof:
文件结束,返回非0值
●clear:
清除所有错误位
●rdstate:
返回当前错误状态
if(cout.fail())
cerr<
文件未打开"
6.6上机指导
6.6.1调试器的使用
VisualC++集成开发环境含有一个很精巧的调试器,这个调试器可以让我们很方便地设定断点,观察变量内容,缓存内容,并允许在调试过程中改变变量的值。
与VisualC++编译器一样,调试器也只能从DeveloperStudio内部访问。
调试一个程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IO