版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C实用教程郑阿奇主编第14章 输入/输出流14.1 概述C实用教程郑阿奇主编14.1.1 流和流类n在C+中,输入/输出操作是由“流”来处理的。流是C+的一个核心概念,数据从一个位置到另一个位置的流动抽象为流。 C实用教程郑阿奇主编14.1.2 标准流对象nC+提供了4个预定义的标准流对象:cin、cout、cerr和clog,它们都是std名称空间的流对象。其中,cin是istream类的对象,用来处理标准输入,即键盘输入;cout是ostream类的对象,用来处理标准输出,即屏幕输出;cerr和clog都是ostream类的对象,用来处理标准出错信息,并将信息显示在屏幕上 C实用教程郑阿奇
2、主编14.1.3 提取和插入运算符重载#include using namespace std;class CStudent;ostream& operator ( istream& is, CStudent& stu );class CStudentpublic:friend ostream& operator ( istream& is, CStudent& stu );private:charstrName10;/ 姓名charstrID10;/ 学号floatfScore3;/ 三门成绩;C实用教程郑阿奇主编ostream& op
3、erator ( ostream& os, CStudent& stu )osendl学生信息如下:endl;os姓名:stu.strNameendl;os学号:stu.strIDendl;os三门成绩:stu.fScore0,tstu.fScore1,tstu.fScore2endl;return os;/ 返回os的目的是允许连续多个 ( istream& is, CStudent& stu )cout请输入学生信息endl;coutstu.strName;coutstu.strID;coutstu.fScore0stu.fScore1stu.fScore2
4、;return is;/ 返回is的目的是允许连续多个操作存在int main()CStudent one;cinone;coutone;return 0;C实用教程郑阿奇主编14.2 格式控制和错误处理n两种格式控制方式:一种是使用ios类中的相关成员函数,如width()、presision()和fill()等;另一种是直接使用的格式操作算子,如oct、hex和dec等 C实用教程郑阿奇主编14.2.1 设置输出宽度和填充字符#include #include / 必须要有此头文件包含必须要有此头文件包含using namespace std;int main()intnNum = 123
5、4;double fNum = 12.3456;cout1234567890endl;coutsetw(10)nNumn;coutsetw(10)nNum-fNumendl;coutsetw(10)nNumsetw(10)fNumendl;coutsetw(10)setfill(#)nNumendl;coutsetw(10)fNumendl;return 0;C实用教程郑阿奇主编14.2.2 控制实数显示#include #include using namespace std;int main()double d = 13.0/17.0;coutdendl;coutsetprecision(
6、1)dendlsetprecision(0)dendlsetprecision(3)dendlsetprecision(5)dendl10.0endl;coutsetiosflags(ios: scientific)dendld*10.0endl;coutsetprecision(6)setiosflags(ios: scientific)dendl;coutsetiosflags(ios:fixed)dendl;return 0;C实用教程郑阿奇主编14.2.3 左右对齐输出例Ex_Left 数据的对齐方式示例。#include #include using namespace std;in
7、t main()intnNum = 1234;cout1234567890setfill(#)endl;coutsetw(10)nNumendl;coutsetw(10)-nNumendl;coutsetiosflags(ios:left)setw(10)nNumendl;coutsetw(10)-nNumendl;return 0;C实用教程郑阿奇主编14.2.4 流的错误处理n在输入/输出过程中,一旦发生操作错误,C+流就会将错误记录下来。用户可以使用C+提供的错误检测功能,检测和查明错误发生的原因和性质,然后须调用ios:clear函数清除错误状态,使流恢复正常操作。n在ios类中,定义
8、了一个公有枚举成员io_state来记录各种错误的性质:enum io_state goodbit= 0 x00,/ 正常eofbit = 0 x01,/ 已达到文件尾failbit = 0 x02,/ 操作失败badbit = 0 x04 / 非法操作;C实用教程郑阿奇主编例Ex_ManipError 检测流的错误示例。#include using namespace std;int main()int i, s;char buf80;couti;s = cin.rdstate();cout流状态为:hexsendl;while (s)cin.clear();cin.getline(buf,
9、 80);couti;s = cin.rdstate();return 0;C实用教程郑阿奇主编14.3 使用输入/输出成员函数n如果想要使输入/输出控制更为细致,如希望把输入的空格作为一个字符而不是分隔符,就需要使用istream类和ostream类中的相关成员函数。C实用教程郑阿奇主编14.3.1 输入操作的成员函数n(1)使用get和getline函数用于输入字符或字符串的成员函数get原型如下:int get();istream& get( char& rch );istream& get( char* pch, int nCount, char delim =
10、 n );n第一种形式是从输入流中提取一个字符,并转换成整第一种形式是从输入流中提取一个字符,并转换成整型数值。第二种形式是从输入流中提取字符到型数值。第二种形式是从输入流中提取字符到rch中。中。第三种形式是从输入流中提取一个字符串并由第三种形式是从输入流中提取一个字符串并由pch返返回回 C实用教程郑阿奇主编 例Ex_GetAndGetLine get和getline的使用示例。 #include using namespace std;int main()char s180, s280, s380;cout请输入一个字符:;coutcin.get()endl;cin.get();/ 提取
11、换行符cout请输入一行字符串:;for (int i=0; i80; i+)cin.get(s1i);if (s1i = n) s1i = 0;break;/ 退出for循环couts1endl;cout请输入一行字符串:;cin.get(s2,80);couts2endl;cin.get();/ 提取换行符cout请输入一行字符串:;cin.getline(s3,80);couts3endl;return 0;程序运行结果如下:C实用教程郑阿奇主编n(2)使用read函数。read函数不仅可以读取字符或字符串(称为文本流),而且可以读取字节流。其原型如下:nistream& rea
12、d( char* pch, int nCount );nistream& read( unsigned char* puch, int nCount );nistream& read( signed char* psch, int nCount ); C实用教程郑阿奇主编 例Ex_Read read函数的使用示例。 n#include nusing namespace std;nint main()nnchar data80;ncout请输入:endl;ncin.read(data, 80);ndatacin.gcount() = 0;ncoutendldataendl;nre
13、turn 0;nn程序运行结果如下 :C实用教程郑阿奇主编14.3.2 输出操作的成员函数nostream类中用于输出的成员函数有put和write,它们的原型如下:nostream& put( char ch );nostream& write( const char* pch, int nCount );nostream& write( const unsigned char* puch, int nCount );nostream& write( const signed char* psch, int nCount );C实用教程郑阿奇主编14.4 文件
14、流nC+中,“文件”有两种含义,一种是指一个具体的外部设备,称为设备文件,如可以把打印机看作一个文件,也可把屏幕看成一个文件;另一种是指一个磁盘文件,即存放在磁盘上的文件,每个文件都有一个文件名。无论是设备文件还是磁盘文件,在C+中都看成是文件流,并提供了相应的流库。 C实用教程郑阿奇主编14.4.1 文件和文件流概述n无论是文本文件还是二进制文件,都需要用文件指针来操纵。一个文件指针总是和一个文件相关联 nC+提供了文件操作的文件流库 C实用教程郑阿奇主编14.4.2 文件流的使用方法n文件操作一般是按定义文件流对象、打开文件、读/写文件、关闭文件这4个步骤进行的 n1. 定义文件流对象文件
15、的操作通常有三种方式,即只读、只写和读写方式 Xstream 对象;C实用教程郑阿奇主编n2. 使用成员函数open打开文件打开文件有两种方式:一种是调用文件流成员函数open,另一种是在定义文件流对象时通过构造函数打开文件 第一种打开方式,使用成员函数open打开文件在ifstream、ofstream或fstream类中,都有一个成员函数open C实用教程郑阿奇主编n3. 使用构造函数打开文件在使用成员函数open打开文件时,需要先定义一个文件流对象 n4. 文件的读/写文件打开后,对文件的读/写操作也有两种方法。第1种方法是使用提取运算符或插入运算符对文件进行读/写操作 第2种方法是使
16、用成员函数get、getline、read、put、write进行文件的读/写操作 C实用教程郑阿奇主编说明 :n(1)若进行文件复制操作,则可在程序中先打开源文件与目标文件,然后用循环语句 n(2)对于文件结尾的判定还可以使用基类ios中的成员函数eof,其原型如下:int ios:eof();当到达文件结束位置时,该函数返回非0值,否则返回0 C实用教程郑阿奇主编n5. 关闭文件n打开一个文件且对文件进行读/写操作后,应调用文件流的成员函数来关闭相应的文件 C实用教程郑阿奇主编14.4.3 顺序文件操作#include #include / 文件操作必须的头文件using namespac
17、e std;int main()fstream file1;/ 定义一个fstream类的对象用于读(Ex_Data, ios:in);if (!file1)coutEx_Data不能打开!n;return 1;fstream file2;/ 定义一个fstream类的对象用于写(Ex_Data, ios:out | ios:trunc);if (!file2)coutEx_Data不能创建!n;();return 1;C实用教程郑阿奇主编char ch;while (!()(&ch, 1);coutch;(&ch, 1);();/ 不要忘记文件使用结束后要及时关闭();cou
18、tendl;return 0;n程序运行结果如下:C实用教程郑阿奇主编14.4.4 随机文件操作n用户可根据具体的读/写操作情况使用C+提供的seek函数将文件指针移动到指定的位置。但在Visual C+中文件指针的定位是通过seekg与seekp成员函数来实现的,seekg函数用于移动输入文件流中的文件指针,seekp函数用于移动输出文件流中的文件指针,它们又可分为绝对定位和相对定位两种操作。n1. 绝对定位用于文件指针绝对定位的seekg和seekp成员函数原型如下:istream& seekg( long pos );ostream& seekp( long pos );
19、C实用教程郑阿奇主编例Ex_AbsLoc 文件指针的绝对定位示例 #include #include / 文件操作的头文件using namespace std;int main()char ch, str=ABCDEFGHIJK;ofstream outfile(letter.dat);/ 用构造函数打开文件letter.datif (!outfile) cout不能打开目标文件: letter.dat!endl;exit(1); out( str, strlen(str) ); / 将字符串str写入letter.dat文件缓冲区out(); / 将缓冲区中字符串写入磁盘文件中 ifstr
20、eam infile(letter.dat); / 用构造函数打开文件letter.datif (!infile) cout不能打开源文件: letter.dat!endl;exit(1);C实用教程郑阿奇主编in(2); / 将文件指针移到第2个字节后in( &ch,1); / 将文件第3个字节处字母读入ch cout第3个字节处的内容是:chendl; / 显示ch的内容 ch = a;out(6); / 将输出文件指针定位在第6个字节后 out(ch); / 将新字母写入第7个字节单元out(); / 刷新缓冲区in(6); / 将输入文件指针定位在第6个字节后 in(ch);/
21、 将输入文件第7个字节内容读入ch cout第7个字节处的内容是:chn; / 显示ch中内容out();in();return 0;n程序运行结果如下:C实用教程郑阿奇主编2. 相对定位相对定位是指文件指针相对于某个位置向前移动或向后移动n个字节,它是由seekg和seekp成员函数的另一个版本来实现的,其函数原型如下:istream& seekg( long off, ios:seek_dir dir );ostream& seekp( long off, ios:seek_dir dir ); 3. 获取文件指针的当前位置值当用seekg或seekp将文件指针移动到文件第
22、n个字节之后时,可用成员函数tellg和tellp获取文件指针的当前位置值。它们的原型如下:long tellg();long tellp();C实用教程郑阿奇主编例Ex_RelLoc 文件指针的相对定位示例。#include #include / 文件操作的头文件using namespace std;int main()char chs, che, str=ABCDEFGHIJK;fstream iofile(letter.dat,ios:in | ios:out );/ 用构造函数打开letter.dat用于读/写if (!iofile) cout不能打开目标文件: letter.dat
23、!endl;exit(1);io( str, strlen(str) ); / 将字符串str写入letter.dat文件缓冲区io();/ 将缓冲区中字符串写入磁盘文件中 io(0, ios:beg );long nStart = io();/ 获取文件流的最前面位置io(0, ios:end );long nEnd = io();/ 获取文件流的末尾位置long nPos = 0;C实用教程郑阿奇主编while ( nStart nEnd )io( nPos, ios:beg );/ 从头开始向后读取nStart = io();io( &chs,1);io(-nPos-1, ios
24、:end );/ 从后往前读取nEnd = io();io( &che,1);/ 交换io( nStart );io( &che, 1 );io( nEnd );io( &chs, 1 );nPos+;io();io(0, ios:beg );/ 输出结果while (!io()nStart = io();if (io(chs)cout当前位置:nStart,内容为:chsendl;io();return 0;C实用教程郑阿奇主编14.5 综合应用实例#include #include #include #include #include using namespace
25、 std;class CStudent;ostream& operator ( istream& is, CStudent& stu );C实用教程郑阿奇主编class CStudentpublic:CStudent()CStudent(char* name, char* id, float s1, float s2, float s3);void print( int n = -1);char* GetName();friend ostream& operator ( istream& is, CStudent& stu );private:c
26、harstrName20;/ 姓名charstrID10;/ 学号floatfScore3;/ 三门课成绩;CStudent:CStudent(char* name, char* id, float s1, float s2, float s3)strncpy(strName, name, 20);strncpy(strID, id, 10);fScore0 = s1;fScore1 = s2;fScore2 = s3;C实用教程郑阿奇主编void CStudent:print( int n )/ n为序号,0) coutsetw(6)序号;coutsetw(22)姓名setw(12)学号se
27、tw(10)成绩1setw(10)成绩2setw(10)成绩30) coutsetw(6)n;coutsetw(22)strNamesetw(12)strIDsetw(10)fScore0setw(10)fScore1setw(10)fScore2endl;char* CStudent:GetName()return strName;ostream& operator ( istream& is, CStudent& stu )char name20;char id10;is.read(name, 20);is.read(id, 10);is.read(char*)stu.fScore, sizeof(stu.fScore) );strncpy(stu.strName, name, 20);strncpy(stu.strID, id, 10);return is;class CStuFilepublic:CStu* );CStuFile();voidadd(CStudent stu);/ 添加记录intseek(char* name, CStudent &stu);/ 按姓名查找,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年康平县带编教师招聘笔试备考题库及答案解析
- 2026年通榆县医疗事业单位人员招聘笔试备考试题及答案解析
- 2026年修武县医疗事业单位人员招聘考试备考试题及答案解析
- 2026年郧西县医疗事业单位人员招聘考试模拟试题及答案解析
- 2026年右玉县带编教师招聘笔试备考题库及答案解析
- 2026年滦平县带编教师招聘笔试备考试题及答案解析
- 2026年松潘县医疗事业单位人员招聘考试备考试题及答案解析
- 2026年代县医疗事业单位人员招聘考试备考试题及答案解析
- 2026年定远县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年泽州县带编教师招聘考试参考题库及答案解析
- 垃圾分类知识科普
- 能耗管理培训课件
- 船舶概论课件
- 内墙铝板施工方案
- 《化妆技巧与形象设计》项目一
- 2023年彝良县人民医院紧缺医学专业人才招聘考试历年高频考点试题含答案解析
- 技术的本质(经典版)
- 过程控制与自动化仪表
- 512地震灾后旅游重建总体规划
- 临床药物治疗学课件
- 气动技术第六讲气动图形规范演示文稿
评论
0/150
提交评论