C实用教程[郑阿奇主编(1).ppt_第1页
C实用教程[郑阿奇主编(1).ppt_第2页
C实用教程[郑阿奇主编(1).ppt_第3页
C实用教程[郑阿奇主编(1).ppt_第4页
C实用教程[郑阿奇主编(1).ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第14章 输入/输出流,14.1 概述,14.1.1 流和流类,在C+中,输入/输出操作是由“流”来处理的。流是C+的一个核心概念,数据从一个位置到另一个位置的流动抽象为流。,14.1.2 标准流对象,C+提供了4个预定义的标准流对象:cin、cout、cerr和clog,它们都是std名称空间的流对象。其中,cin是istream类的对象,用来处理标准输入,即键盘输入;cout是ostream类的对象,用来处理标准输出,即屏幕输出;cerr和clog都是ostream类的对象,用来处理标准出错信息,并将信息显示在屏幕上,14.1.3 提取和插入运算符重载,#include using namespace std; class CStudent; ostream,ostream ,14.2 格式控制和错误处理,两种格式控制方式:一种是使用ios类中的相关成员函数,如width()、presision()和fill()等;另一种是直接使用的格式操作算子,如oct、hex和dec等,14.2.1 设置输出宽度和填充字符,#include #include / 必须要有此头文件包含 using namespace std; int main() int nNum = 1234; double fNum = 12.3456; cout“1234567890“endl; coutsetw(10)nNumn; coutsetw(10)nNum-fNumendl; coutsetw(10)nNumsetw(10)fNumendl; coutsetw(10)setfill(#)nNumendl; coutsetw(10)fNumendl; return 0; ,14.2.2 控制实数显示,#include #include using namespace std; int main() double d = 13.0/17.0; cout dendl; cout setprecision(1)dendl setprecision(0)dendl setprecision(3)dendl setprecision(5)dendl 10.0endl; cout setiosflags(ios: scientific)dendld*10.0endl; cout setprecision(6)setiosflags(ios: scientific)dendl; cout setiosflags(ios:fixed)dendl; return 0; ,14.2.3 左右对齐输出,例Ex_Left 数据的对齐方式示例。 #include #include using namespace std; int main() int nNum = 1234; cout“1234567890“setfill(#)endl; coutsetw(10)nNumendl; coutsetw(10)-nNumendl; coutsetiosflags(ios:left)setw(10)nNumendl; coutsetw(10)-nNumendl; return 0; ,14.2.4 流的错误处理,在输入/输出过程中,一旦发生操作错误,C+流就会将错误记录下来。用户可以使用C+提供的错误检测功能,检测和查明错误发生的原因和性质,然后须调用ios:clear函数清除错误状态,使流恢复正常操作。 在ios类中,定义了一个公有枚举成员io_state来记录各种错误的性质: enum io_state goodbit = 0x00, / 正常 eofbit = 0x01, / 已达到文件尾 failbit = 0x02, / 操作失败 badbit = 0x04 / 非法操作 ;,例Ex_ManipError 检测流的错误示例。,#include using namespace std; int main() int i, s; char buf80; couti; s = cin.rdstate(); couti; s = cin.rdstate(); return 0; ,14.3 使用输入/输出成员函数,如果想要使输入/输出控制更为细致,如希望把输入的空格作为一个字符而不是分隔符,就需要使用istream类和ostream类中的相关成员函数。,14.3.1 输入操作的成员函数,(1)使用get和getline函数用于输入字符或字符串的成员函数get原型如下: int get(); istream 第一种形式是从输入流中提取一个字符,并转换成整型数值。第二种形式是从输入流中提取字符到rch中。第三种形式是从输入流中提取一个字符串并由pch返回,例Ex_GetAndGetLine get和getline的使用示例。,#include using namespace std; int main() char s180, s280, s380; cout“请输入一个字符:“; coutcin.get()endl; cin.get(); / 提取换行符 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; 程序运行结果如下:,(2)使用read函数。read函数不仅可以读取字符或字符串(称为文本流),而且可以读取字节流。其原型如下: istream,例Ex_Read read函数的使用示例。,#include using namespace std; int main() char data80; cout“请输入:“endl; cin.read(data, 80); datacin.gcount() = 0; coutendldataendl; return 0; 程序运行结果如下 :,14.3.2 输出操作的成员函数,ostream类中用于输出的成员函数有put和write,它们的原型如下: ostream,14.4 文件流,C+中,“文件”有两种含义,一种是指一个具体的外部设备,称为设备文件,如可以把打印机看作一个文件,也可把屏幕看成一个文件;另一种是指一个磁盘文件,即存放在磁盘上的文件,每个文件都有一个文件名。无论是设备文件还是磁盘文件,在C+中都看成是文件流,并提供了相应的流库。,14.4.1 文件和文件流概述,无论是文本文件还是二进制文件,都需要用文件指针来操纵。一个文件指针总是和一个文件相关联 C+提供了文件操作的文件流库,14.4.2 文件流的使用方法,文件操作一般是按定义文件流对象、打开文件、读/写文件、关闭文件这4个步骤进行的 1. 定义文件流对象 文件的操作通常有三种方式,即只读、只写和读写方式 Xstream 对象;,2. 使用成员函数open打开文件 打开文件有两种方式:一种是调用文件流成员函数open,另一种是在定义文件流对象时通过构造函数打开文件 第一种打开方式,使用成员函数open打开文件在ifstream、ofstream或fstream类中,都有一个成员函数open,3. 使用构造函数打开文件 在使用成员函数open打开文件时,需要先定义一个文件流对象 4. 文件的读/写 文件打开后,对文件的读/写操作也有两种方法。 第1种方法是使用提取运算符或插入运算符对文件进行读/写操作 第2种方法是使用成员函数get、getline、read、put、write进行文件的读/写操作,说明 :,(1)若进行文件复制操作,则可在程序中先打开源文件与目标文件,然后用循环语句 (2)对于文件结尾的判定还可以使用基类ios中的成员函数eof,其原型如下: int ios:eof(); 当到达文件结束位置时,该函数返回非0值,否则返回0,5. 关闭文件 打开一个文件且对文件进行读/写操作后,应调用文件流的成员函数来关闭相应的文件,14.4.3 顺序文件操作,#include #include / 文件操作必须的头文件 using namespace std; int main() fstream file1; / 定义一个fstream类的对象用于读 file1.open(“Ex_DataFile.txt“, ios:in); if (!file1) cout“Ex_DataFile.txt不能打开!n“; return 1; fstream file2; / 定义一个fstream类的对象用于写 file2.open(“Ex_DataFileBak.txt“, ios:out | ios:trunc); if (!file2) cout“Ex_DataFileBak.txt不能创建!n“; file1.close(); return 1; ,char ch; while (!file1.eof() file1.read( 程序运行结果如下:,14.4.4 随机文件操作,用户可根据具体的读/写操作情况使用C+提供的seek函数将文件指针移动到指定的位置。但在Visual C+中文件指针的定位是通过seekg与seekp成员函数来实现的,seekg函数用于移动输入文件流中的文件指针,seekp函数用于移动输出文件流中的文件指针,它们又可分为绝对定位和相对定位两种操作。 1. 绝对定位 用于文件指针绝对定位的seekg和seekp成员函数原型如下: istream,例Ex_AbsLoc 文件指针的绝对定位示例,#include #include / 文件操作的头文件 using namespace std; int main() char ch, str=“ABCDEFGHIJK“; ofstream outfile(“letter.dat“); / 用构造函数打开文件letter.dat if (!outfile) cout“不能打开目标文件: letter.dat!“endl; exit(1); outfile.write( str, strlen(str) ); / 将字符串str写入letter.dat文件缓冲区 outfile.flush(); / 将缓冲区中字符串写入磁盘文件中 ifstream infile(“letter.dat“); / 用构造函数打开文件letter.dat if (!infile) cout“不能打开源文件: letter.dat!“endl; exit(1); ,infile.seekg(2); / 将文件指针移到第2个字节后 infile.read( 程序运行结果如下:,2. 相对定位 相对定位是指文件指针相对于某个位置向前移动或向后移动n个字节,它是由seekg和seekp成员函数的另一个版本来实现的,其函数原型如下: istream,例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!“endl; exit(1); iofile.write( str, strlen(str) ); / 将字符串str写入letter.dat文件缓冲区 iofile.flush(); / 将缓冲区中字符串写入磁盘文件中 iofile.seekg(0, ios:beg ); long nStart = iofile.tellg(); / 获取文件流的最前面位置 iofile.seekg(0, ios:end ); long nEnd = iofile.tellg(); / 获取文件流的末尾位置 long nPos = 0;,while ( nStart nEnd ) iofile.seekg( nPos, ios:beg ); / 从头开始向后读取 nStart = iofile.tellg(); iofile.read( ,14.5 综合应用实例,#include #include #include #include #include using namespace std; class CStudent; ostream,class CStudent public: CStudent() CStudent(char* name, char* id, float s1, float s2, float s3); void print( int n = -1); char* GetName(); friend ostream ,void CStudent:print( int n ) / n为序号,0) cout0) coutsetw(6)n; coutsetw(22)strNamesetw(12)strID setw(10)fScore0setw(10)fScore1setw(10)fScore2endl; char* CStudent:GetName() return strName; ostream ,istream ,CStuFile:CStuFile() if (thefile.is_open() ) thefile.close(); void CStuFile:add(CStudent stu) / 将文件指针定位到结尾,然后添加 thefile.seekp( 0, ios:end ); thefilestu) if (strncmp(name, stu.GetName(), strlen(name) = 0) nRec = i; break; i+; return nRec; ,void CStuFile:list() / 列表显示 CStudent stu; / 将文件指针定位到文件头,然

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论