第14章 输入与输出流类库_第1页
第14章 输入与输出流类库_第2页
第14章 输入与输出流类库_第3页
第14章 输入与输出流类库_第4页
第14章 输入与输出流类库_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1 第第 1414 章章 输入与输出流类库输入与输出流类库 C C 的的 I OI O 流类 是目前最常用的流类 是目前最常用的 I OI O 系统 本章介绍系统 本章介绍 C C 输入与输出流类库 通过输入与输出流类库 通过 本章的学习 读者可以了解怎样使用本章的学习 读者可以了解怎样使用 C C 面向对象的输入面向对象的输入 输出流 能够格式化输入和输输出流 能够格式化输入和输 出 了解出 了解 I OI O 流类的层次结构 了解怎样输入流类的层次结构 了解怎样输入 输出用户自定义类型的对象 能够建立用输出用户自定义类型的对象 能够建立用 户自定义的流操作符 能够确定输入户自定义的流操作符 能够确定输入 输出操作的成功与失败 能够把输出流连到输入流输出操作的成功与失败 能够把输出流连到输入流 上 上 14 114 1 I OI O 流类的结构流类的结构 略 略 14 214 2 文件流类文件流类 C C 语言把每个文件都看成一个有序的字节流 每个文件或者以文件结束符结束 或语言把每个文件都看成一个有序的字节流 每个文件或者以文件结束符结束 或 者在特定的字节号处结束 该字节号通常记录在由系统维护和管理的数据结构中 者在特定的字节号处结束 该字节号通常记录在由系统维护和管理的数据结构中 当打 当打 开一个文件时 该文件就和某个流关联起来 系统自动生成开一个文件时 该文件就和某个流关联起来 系统自动生成 cincin coutcout cerrcerr clogclog 对对 象 流使用这些对象所关联的特定文件或输入象 流使用这些对象所关联的特定文件或输入 输出设备和程序之间建立通信通道 输出设备和程序之间建立通信通道 要在要在 C C 中进行文件处理 就要包含头文件中进行文件处理 就要包含头文件和和 头文件包括流类头文件包括流类 ifstream ifstream 从文件输入从文件输入 ofstreamofstream 向文件 向文件 输出 和输出 和 fstreamfstream 从文件输入 从文件输入 输出 的定义 生成这些流类的对象即可打开文件 这输出 的定义 生成这些流类的对象即可打开文件 这 些流类分别从些流类分别从 istreamistream ostreamostream 和和 iostreamiostream 类派生 其层次结构如图类派生 其层次结构如图 14 214 2 ios istreamostream iostreamifstreamofstream fstream 图图 14 214 2 文件流类的继承关系文件流类的继承关系 在在 C C 中 要定义一个文件流类对象 必须规定文件名和打开方式 中 要定义一个文件流类对象 必须规定文件名和打开方式 类类 ofstreamofstream 用于执行文件输出 该类有几个构造函数 其中最有用的是 用于执行文件输出 该类有几个构造函数 其中最有用的是 ofstream ofstream char ofstream ofstream char pFileName pFileName 指向要打开的文件名字符串指向要打开的文件名字符串 intint nModenMode ios out ios out 打开方式打开方式 intint nProtnProt filebuf openprot filebuf openprot 文件保护方式文件保护方式 nModenMode 参数是打开方式 它的含义见表参数是打开方式 它的含义见表 14 114 1 表表 14 114 1 文件打开选择项文件打开选择项 标志标志含义含义 ios appios app 将所有输出写入文件尾将所有输出写入文件尾 ios ateios ate 打开文件以便输出 并移到文件末尾 通常用于添加数打开文件以便输出 并移到文件末尾 通常用于添加数 据 据 数据可以写入文件中的任何地方 数据可以写入文件中的任何地方 2 ios inios in 打开文件以便写入 打开文件以便写入 ifstreamifstream 默认 默认 ios outios out 打开文件以便输出打开文件以便输出 ofstream ofstream 默认默认 ios truncios trunc 删除文件现有内容删除文件现有内容 是是 ios outios out 的默认操作的默认操作 ios nocreateios nocreate 如果文件不存在 则文件打开失败如果文件不存在 则文件打开失败 ios noreplaceios noreplace 如果文件存在 则文件打开失败如果文件存在 则文件打开失败 nProtnProt 是文件保护方式 它的选择项见表是文件保护方式 它的选择项见表 14 214 2 表表 14 214 2 文件保护方式选择项文件保护方式选择项 标志标志含义含义 filebuf openprotfilebuf openprot 兼容共享方式兼容共享方式 filebuf sh nonefilebuf sh none 独占 不共享独占 不共享 filebuf sh readfilebuf sh read 允许读共享允许读共享 file sh writefile sh write 允许写共享允许写共享 由于由于 C C 把文件看作是无结构的字节流 所以为了在文件中记录特定结构的内容 必把文件看作是无结构的字节流 所以为了在文件中记录特定结构的内容 必 须给文件加上记录结构 下面的程序演示了班级学生成绩表 学号作为记录关键字 文须给文件加上记录结构 下面的程序演示了班级学生成绩表 学号作为记录关键字 文 件按学号顺序建立和维护 假定用户按学号顺序键入记录 程序将把键入的记录保存并件按学号顺序建立和维护 假定用户按学号顺序键入记录 程序将把键入的记录保存并 写入文件 程序示例如下 写入文件 程序示例如下 例例 14 414 4 文件流操作实例文件流操作实例 演示文件流操作演示文件流操作 include include stdafx h stdafx h include include include include include include intint main main intint regNumber regNumber charchar name 30 name 30 floatfloat grade grade 使用使用 ofstreamofstream 类的构造函数打开文件类的构造函数打开文件 ofstreamofstream outGradeFile C grade dat ios out outGradeFile C grade dat ios out 也可以先创建输出流类对象 再用也可以先创建输出流类对象 再用 openopen 操作打开文件操作打开文件 ofstream ofstream outGradeFile outGradeFile outGradeFile open C grade dat ios out outGradeFile open C grade dat ios out if outGradeFile if outGradeFile cerr cerr 文件不能被打开文件不能被打开 endl endl 3 exit 1 exit 1 函数原形定义在函数原形定义在 stdlib hstdlib h 中中 cout cout 请输入学号 姓名 和成绩 请输入学号 姓名 和成绩 n n regNumber name grade while cin regNumber name grade outGradeFile regNumber outGradeFile regNumber name name grade n grade n cout cout outGradeFile close outGradeFile close ifstreamifstream inGradeFile C grade dat ios in inGradeFile C grade dat ios in 也可以先创建输入流类对象 再用也可以先创建输入流类对象 再用 openopen 操作打开文件操作打开文件 ifstream ifstream inGradeFile inGradeFile inGradeFile open C grade dat ios in inGradeFile open C grade dat ios in cout cout regNumber name grade while inGradeFile regNumber name grade cout regNumber cout regNumber name name grade n grade n cout cout inGradeFile close inGradeFile close returnreturn 0 0 ofstream ofstream 的析构函数将关闭文件的析构函数将关闭文件 程序运行结果如下 程序运行结果如下 请输入学号 姓名 和成绩 请输入学号 姓名 和成绩 按输入文件结束符结束 按输入文件结束符结束 123123 aaaaaa 7878 234234 bbbbbb 8989 345345 cccccc 6969 Z Z 123123 aaaaaa 7878 234234 bbbbbb 8989 345345 cccccc 6969 上例中 对于文件名要说明其路径 斜杠要双写 因为编译器理解下的斜杠是字符上例中 对于文件名要说明其路径 斜杠要双写 因为编译器理解下的斜杠是字符 4 转换符 这和包含头文件时的路径不一样 因为包含头文件是由编译预器处理的 转换符 这和包含头文件时的路径不一样 因为包含头文件是由编译预器处理的 文件打开时 对于使用文件打开时 对于使用 ofstreamofstream 类构造对象时 其打开方式默认为类构造对象时 其打开方式默认为 ios out ios truncios out ios trunc 即该文件每次打开 如果原先存在 则都会先被清空内容 否则 即该文件每次打开 如果原先存在 则都会先被清空内容 否则 就新建 就新建 如果要打开二进制文件 写方式 输出到文件尾 可以如下操作 如果要打开二进制文件 写方式 输出到文件尾 可以如下操作 ofstreamofstream bfile binfile ios binary ios ate bfile binfile ios binary ios ate 也可以生成也可以生成 oftreamoftream 对象而不打开特定文件 而在后面再将文件与对象相连接 可对象而不打开特定文件 而在后面再将文件与对象相连接 可 以如下操作 以如下操作 ofstreamofstream outFile outFile outFile open abc dat ios out outFile open abc dat ios out 如果需要打开一个输入文件 从文件中读取数据可以如下操作 如果需要打开一个输入文件 从文件中读取数据可以如下操作 ifstreamifstream myinf C grade dat ios nocreate myinf C grade dat ios nocreate if myinf fail if myinf fail cerr cerr regNumber name grade myinf regNumber name grade 对于打开文件是否操作成功 可以使用重载的对于打开文件是否操作成功 可以使用重载的 iosios 运算符成员函数运算符成员函数 操作符确定打开操作符确定打开 是否成功 如果打开操作的流将是否成功 如果打开操作的流将 failbitfailbit 或或 badbitbadbit 置位 则条件 置位 则条件 outGradeFile outGradeFile 返 返 回非回非 0 0 值 值 truetrue 也可以通过判断 也可以通过判断 fail fail 成员函数来确定打开文件是否出错 成员函数来确定打开文件是否出错 如果打开文件同时用于输入和输出 则可以如下操作 如果打开文件同时用于输入和输出 则可以如下操作 fstreamfstream myinout abc dat ios in ios out myinout abc dat ios in ios out 用用 fstreamfstream 打开的文件 打开方式不能默认 打开的文件 打开方式不能默认 14 314 3 串流类串流类 不讲 不讲 ostrstreamostrstream istrstreamistrstream strstreamstrstream 是串流类 在是串流类 在 strstrea hstrstrea h 中定义 其中 中定义 其中 strstreamstrstream 类是从类是从 ostrstreamostrstream 和和 istrstreamistrstream 类多重继承而来的子类 要定义一个串流类类多重继承而来的子类 要定义一个串流类 对象 须提供字符数组和数组大小 对象 须提供字符数组和数组大小 类类 istrstreamistrstream 用于串流输入 该类有几个构造函数 其中最有用的是 用于串流输入 该类有几个构造函数 其中最有用的是 istrstream istrstream constistrstream istrstream const char char pch pch istrstream istrstream constistrstream istrstream const char char pch intpch int nLength nLength 第一个参数指出字符串数组 第二个参数说明数组大小 当第一个参数指出字符串数组 第二个参数说明数组大小 当 sizesize 为为 0 0 时 表示把时 表示把 istrstreamistrstream 类对象连接到由类对象连接到由 pchpch 指向的以空字符结束的字符串 指向的以空字符结束的字符串 类类 ostrstreamostrstream 用于执行串流输出 该类也有几个构造函数 其中最有用的是 用于执行串流输出 该类也有几个构造函数 其中最有用的是 ostrstream ostrstream char ostrstream ostrstream char pch intpch int nLength intnLength int nMode ios out nMode ios out 第一个参数指出字符串数组 第二个参数说明数组大小 第三个参数指出打开方式 第一个参数指出字符串数组 第二个参数说明数组大小 第三个参数指出打开方式 5 下面的实例演示了如何使用串流输入输出功能 下面的实例演示了如何使用串流输入输出功能 例例 14 514 5 串流输入输出功能实例串流输入输出功能实例 演示串流输入输出功能演示串流输入输出功能 include include include include include include char char parseString char parseString char pch pch intint number number floatfloat balance balance 计算需要构造的串流类的长度计算需要构造的串流类的长度 strlen strlen 返回字符串长度返回字符串长度 其定义包含在其定义包含在 string hstring h 中中 intint nLength strlen nLength strlen 帐号 帐号 strlen strlen 收支 收支 strlen pch strlen pch istrstreamistrstream inp pch 0 inp pch 0 ios in ios in 方式 读到方式 读到 nullnull 结束结束 inp number balance inp number balance 从串流中读入一个整数和浮点数从串流中读入一个整数和浮点数 charchar pBuffer new pBuffer new char nLength char nLength ostrstreamostrstream outp pBuffer nLength ios outoutp pBuffer nLength ios out 方式 字串长度为计算出的方式 字串长度为计算出的 nLengthnLength 刚好满足输出到刚好满足输出到 pBufferpBuffer 中的长度要求中的长度要求 outp outp 帐号 帐号 number number 收支 收支 balance balance 写入写入 pBufferpBuffer 中中 注意该处如果写入超出注意该处如果写入超出 pBufferpBuffer 空间长度的字符 空间长度的字符 超出部分将不会被写入超出部分将不会被写入 returnreturn pBuffer pBuffer intint main main charchar pch 1001 pch 1001 125 45 125 45 6 charchar pBuf parseString pch pBuf parseString pch cout pBuf endl cout pBuf endl deletedelete pBuf pBuf returnreturn 0 0 演示结果如下 演示结果如下 帐号 帐号 10011001 收支 收支 125 45125 45 在函数在函数 parseString parseString 中 先定义了一个输入串流对象中 先定义了一个输入串流对象 inp inp 将输入设备将输入设备 pchpch 中的字中的字 符输入到了一个整数和一个浮点数中 然后 定义了一个输出串流对象符输入到了一个整数和一个浮点数中 然后 定义了一个输出串流对象 outp outp 将提示信息将提示信息 和这两个变量输出到和这两个变量输出到 outpoutp 连接的输出设备 实际为一字符串空间 连接的输出设备 实际为一字符串空间 pbufferpbuffer 中 中 注意语句 注意语句 outp outp 帐号 帐号 number number 收支 收支 balance balance 它同时也将提示信息它同时也将提示信息 帐号 帐号 收支 收支 也写入到了输出设备也写入到了输出设备 pbufferpbuffer 中 中 14 414 4 格式控制格式控制 浏览 浏览 C C 提供了大量用于执行格式化输入提供了大量用于执行格式化输入 输出的流格式控制以及流对象成员函数 比如 输出的流格式控制以及流对象成员函数 比如 设置域宽 设置精度 设置和清除格式化标志 设置域填充符 刷新流 在输出流中插设置域宽 设置精度 设置和清除格式化标志 设置域填充符 刷新流 在输出流中插 入换行符并刷新该流 在输出流中插入空字符 跳过输入流中的空白字符等等 入换行符并刷新该流 在输出流中插入空字符 跳过输入流中的空白字符等等 控制符是在头文件控制符是在头文件 iomanip hiomanip h 中定义的对象 可以将它们直接插入流中 来控制流中定义的对象 可以将它们直接插入流中 来控制流 输入输入 输出的格式 使用成员函数控制 则需要在格式化输出之前调用相关格式设置成员输出的格式 使用成员函数控制 则需要在格式化输出之前调用相关格式设置成员 函数 函数 14 4 114 4 1 整数流的基数控制整数流的基数控制 整数通常被解释为十进制 基数为整数通常被解释为十进制 基数为 1010 整数 可以通过在流中插入控制符而改变流 整数 可以通过在流中插入控制符而改变流 中整数的基数 插入控制符中整数的基数 插入控制符 hexhex 可设置成十六进制基数 插入控制符可设置成十六进制基数 插入控制符 octoct 可设置成八进可设置成八进 制基数 插入控制符制基数 插入控制符 decdec 可恢复十进制基数 同样可以使用成员函数可恢复十进制基数 同样可以使用成员函数 flagsflags 来设置整数来设置整数 流的基数 下面的程序演示了这些控制符和成员函数的用法 流的基数 下面的程序演示了这些控制符和成员函数的用法 例例 14 614 6 整数流格式控制实例整数流格式控制实例 演示整数流格式控制演示整数流格式控制 include include include include intint main main 7 intint n n cout cout n cin n cout n cout n 的十六进制为的十六进制为 hex n n hex n n dec n dec n 的八进制为的八进制为 oct n n oct n n cout flags 10 cout flags 10 cout cout 恢复十进制为恢复十进制为 n endl n endl returnreturn 0 0 演示结果如下 演示结果如下 输入一个十进制整数输入一个十进制整数 15 15 1515 的十六进制为的十六进制为 f f 1515 的八进制为的八进制为 1717 恢复十进制为恢复十进制为 15 15 14 4 214 4 2 设置浮点数精度设置浮点数精度 控制浮点流的精度 可以使用控制符控制浮点流的精度 可以使用控制符 setprecisionsetprecision 或成员函数或成员函数 precisionprecision 来格式来格式 化小数点后面的位数 化小数点后面的位数 语句 语句 cout setprecision 4 fValue cout setprecision 4 fValue 和语句 和语句 cout precision 4 cout precision 4 cout fValue cout fValue 起到了同样的效果 都将浮点型数据起到了同样的效果 都将浮点型数据 fValuefValue 按精确到小数点后面按精确到小数点后面 4 4 位数输出 位数输出 14 4 314 4 3 设置域宽设置域宽 成员函数成员函数 ios widthios width 设置当前的域宽 即输入输出的字符数 并返回以前设置的域设置当前的域宽 即输入输出的字符数 并返回以前设置的域 宽 如果显示数据所需的宽度比设置的域宽小 空位用填充字符填充 如果显示数据所宽 如果显示数据所需的宽度比设置的域宽小 空位用填充字符填充 如果显示数据所 需的宽度比设置的域宽大 显示数据并不会被截断 而是输出所有位 但可能会出现乱需的宽度比设置的域宽大 显示数据并不会被截断 而是输出所有位 但可能会出现乱 码 码 控制符控制符 setwsetw 也可以用来设置域宽 也可以用来设置域宽 它们的用法如下 它们的用法如下 cout width 8 cout width 8 cout 10 cout 10 8 上面的语句将在输出上面的语句将在输出 1010 之前输出之前输出 6 6 个空格 默认填充符 个空格 默认填充符 cout setw 8 10 cout setw 8 10 这条语句可以起到同样的效果 这条语句可以起到同样的效果 需要注意的是需要注意的是 setw n setw n 或或 width n width n 在下一个域输出后 域宽回到原先的默认值 在下一个域输出后 域宽回到原先的默认值 setw setw 的默认域宽为的默认域宽为 0 0 意思是按输出对象的表示宽度输出 意思是按输出对象的表示宽度输出 下面的语句中 下面的语句中 2020 将紧挨着将紧挨着 1010 输出 输出 cout setw 8 10 20 cout setw 8 10 20 14 4 414 4 4 设置填充符设置填充符 可以使用成员函数可以使用成员函数 fillfill 或控制符或控制符 setfillsetfill 来改变所要填充的字符 来改变所要填充的字符 cout fill cout fill cout setw 8 10 cout setw 8 10 输出结果为 输出结果为 10 10 由于输出域宽为由于输出域宽为 8 8 所以在 所以在 1010 前面填充了前面填充了 6 6 个个 下面的语句将起到同样的效果 下面的语句将起到同样的效果 cout setfill set 8 10 cout setfill set 8 10 14 4 514 4 5 用户自定义流格式控制符用户自定义流格式控制符 C C 提供了非常多的流格式控制符和成员函数来格式化流输入提供了非常多的流格式控制符和成员函数来格式化流输入 输出 上面仅介绍了输出 上面仅介绍了 常用的几种控制和成员函数的使用方法 在这里 再简单介绍一种用户自定义流控制符常用的几种控制和成员函数的使用方法 在这里 再简单介绍一种用户自定义流控制符 的方法 先看下面的程序示例 的方法 先看下面的程序示例 例例 14 714 7 用户自定义流格式控制符实例用户自定义流格式控制符实例 演示用户自定义流格式控制符演示用户自定义流格式控制符 include include 警告符 输出时会发出系统警告声音警告符 输出时会发出系统警告声音 ostream a 回车符回车符 ostream r 水平制表符 是光标移到下一个制表位水平制表符 是光标移到下一个制表位 ostream t 换行符换行符 ostreamoutput n flush 9 intint main main cout cout 测试制表符测试制表符 endLine endLine a tab b tab c endLine a tab b tab c endLine 测试回车符和警告符测试回车符和警告符 endLine endLine cout bell cout bell cout ret endLine cout ret endLine returnreturn 0 0 演示结果如下 演示结果如下 测试制表符测试制表符 a a b b c c 测试回车符和警告符测试回车符和警告符 在上面的例子中 演示了如何建立和使用新的流控制符在上面的例子中 演示了如何建立和使用新的流控制符 bellbell retret tabtab 和和 endLineendLine 需要注意的是 程序用 需要注意的是 程序用 endLineendLine 插入输出了换行符 然后输出插入输出了换行符 然后输出 7 7 个省略号个省略号 输出系统警告声 再插入 输出系统警告声 再插入 retret 回车 再输出回车 再输出 5 5 个破仄号个破仄号 结果省略号被破结果省略号被破 仄号覆盖了前面部分 仄号覆盖了前面部分 14 514 5 流类成员函数的使用流类成员函数的使用 在在 C C 中 经常使用中 经常使用 cincin coutcout 来做输入来做输入 输出 比较常用的输出 比较常用的 I OI O 流的成员函数有流的成员函数有 getget getlinegetline putput eofeof 等 等 GetGet 函数原型有很多个 比较常用的函数原型有 函数原型有很多个 比较常用的函数原型有 charchar istream get istream get istreamdelim n istream 不带参数的不带参数的 getget 函数从指定的输入流中读取一个字符 包括空白字符 函数从指定的输入流中读取一个字符 包括空白字符 并返回该字 并返回该字 符 当遇到输入流中的文件结束符时 返回符 当遇到输入流中的文件结束符时 返回 EOFEOF 带一个字符型参数的带一个字符型参数的 getget 成员函数自动读取一个字符 包括空白字符 到字符型参成员函数自动读取一个字符 包括空白字符 到字符型参 数中 当遇到文件结束符时 返回数中 当遇到文件结束符时 返回 0 0 否则返回对 否则返回对 istreamistream 对象的引用 对象的引用 带三个参数的带三个参数的 getget 成员函数的参数分别是接收字符的字符数组 字符数组的大小和成员函数的参数分别是接收字符的字符数组 字符数组的大小和 分隔符 默认值为分隔符 默认值为 n n 该函数或者在读取比指定的最大字符数少一个字符后结束 该函数或者在读取比指定的最大字符数少一个字符后结束 或者在遇到分隔符时结束 或者在遇到分隔符时结束 下面的程序循环读入字符 直到用户键入一个下面的程序循环读入字符 直到用户键入一个 Y Y 字符 或遇到文件结束符 在字符 或遇到文件结束符 在 UNIXUNIX 与与 MacintoshMacintosh 上 文件结束符为上 文件结束符为 d d 在 在 PCPC 与与 VAXVAX 上文件结束符为上文件结束符为 z z 例例 14 814 8 I OI O 流成员函数的使用实例流成员函数的使用实例 10 演示演示 I OI O 流的流的 getget putput eofeof 成员函数的使用成员函数的使用 include include include include intint main main charchar ch ch while cin eof while cin eof ch cin get ch cin get ch toupper ch ch toupper ch if ch Y if ch Y cout put ch cout put ch break break cout ch cout buf fin buf 应改成应改成 istreamistream fin abc dat fin abc dat charchar buf 80 buf 80 fin get buffer 80 fin get buffer 80 getlinegetline 成员函数原型为成员函数原型为 getline char getline char pch pch intint nCount charnCount char delim n delim n getlinegetline 函数与带三个参数的函数与带三个参数的 getget 函数类似 它读取一行信息到字符数组中 然后插函数类似 它读取一行信息到字符数组中 然后插 入一个空字符 所不同的是 入一个空字符 所不同的是 getlinegetline 要去除输入流中的分隔符 即读取字符并删除它 要去除输入流中的分隔符 即读取字符并删除它 但是不把它存放在字符数组中 而三个参数的但是不把它存放在字符数组中 而三个参数的 getget 函数不把分隔符放在数组中 却仍然函数不把分隔符放在数组中 却仍然 将它保留在输入流中 下面的程序演示了两者之间的区别 将它保留在输入流中 下面的程序演示了两者之间的区别 例例 14 914 9 演示演示 getget getlinegetline 的区别实例的区别实例 11 演示演示 getget getlinegetline 的区别的区别 include include include include intint main main charchar str 128 str 128 charchar lineStr 128 lineStr 128 cout cout 使用使用 getget 函数函数 请用键盘输入下面这行字符后按回车请用键盘输入下面这行字符后按回车 nThis nThis isis A A Line endl Line endl cin get str sizeof str A cin get str sizeof str A cout Firstcout First line str endl line str endl cin get str sizeof str cin get str sizeof str cout Secondcout Second line str endl line str endl cout cout 使用使用 getlinegetline 函数函数 请用键盘输入下面这行字符后按回车请用键盘输入下面这行字符后按回车 nThis nThis isis A A Line endl Line endl cin getline lineStr sizeof lineStr A cin getline lineStr sizeof lineStr A cout Firstcout First line lineStr endl line lineStr endl cin getline lineStr sizeof lineStr cin getline lineStr sizeof lineStr cout Secondcout Second line lineStr endl line lineStr endl returnreturn 0 0 演示结果如下 演示结果如下 使用使用 getget 函数函数 请用键盘输入下面这行字符后按回车请用键盘输入下面这行字符后按回车 ThisThis isis A A LineLine ThisThis isis A A LineLine FirstFirst line Thisline This isis SecondSecond line Aline A LineLine 使用使用 getlinegetline 函数函数 请用键盘输入下面这行字符后按回车请用键盘输入下面这行字符后按回车 ThisThis isis A A LineLine ThisThis isis A A LineLine FirstFirst line line ThisThis isis SecondSecond line line LineLine 可以看到使用可以看到使用 getget 函数函数 A A 被保留在输入流中 成为了第二行的第一个字母 使用被保留在输入流中 成为了第二行的第一个字母 使用 getlinegetline 函数 函数 A A 被删除掉了 需要注意的是 使用被删除掉了 需要注意的是 使用 getlinegetline 时 输出的第一行字符掉到时 输出的第一行字符掉到 12 了下一行 原因在于前面第二次使用了下一行 原因在于前面第二次使用 getget 输入时 默认分隔符为换行符 所以第一次使输入时 默认分隔符为换行符 所以第一次使 用用 getlinegetline 时 实际上首先输入的是仍然保留在输入流中的换行符 时 实际上首先输入的是仍然保留在输入流中的换行符 14 614 6 数据文件的数据文件的 I OI O 操作操作 在在 C C 中 对于文件的输入中 对于文件的输入 输出 可以使用流类输出 可以使用流类 ifstream ifstream 从文件输入从文件输入 ofstreamofstream 向文件输出 和 向文件输出 和 fstreamfstream 从文件输入 从文件输入 输出 输出 get get 和和 put put 只能进行单个字符的读写 只能进行单个字符的读写 Read Read 和和 write write 则能够实现成组读写 则能够实现成组读写 writewrite 函数函数 原型 原型 istreamnumber bytes 功能 缓冲功能 缓冲 ch bufferch buffer 中写中写 number bytesnumber bytes 个字节到输出流文件中 个字节到输出流文件中 readread 函数函数 原型 原型 istreamnumber bytes 功能 从输入流文件中读功能 从输入流文件中读 number bytesnumber bytes 个字节到缓冲个字节到缓冲 ch bufferch buffer 中 中 程序举例 程序举例 include include include include include include structstruct st st charchar num 10 num 10 charchar name 30 name 30 charchar addr 40 addr 40 intint main main staticstatic structstruct stst obj obj 使用使用 ofstreamofstream 类的构造函数打开文件类的构造函数打开文件 ofstreamofstream outGradeFile outGradeFile outGradeFile open C grade2 dat ios out outGradeFile open C grade2 dat ios out if outGradeFile if outGradeFile cerr cerr 文件不能被打开文件不能被打开 endl endl exit 1 exit 1 函数原形定义在函数原形定义在 stdlib hstdlib h 中中 cout cout obj num obj name obj addr while cin obj num obj name obj addr outGradeFile write charoutGradeFile write char st cout cout 13 outGradeFile close outGradeFile close ifstreamifstream inGradeFile inGradeFile inGradeFile open C grade2 dat ios in inGradeFile open C grade2 dat ios in cout cout inGradeFile seekg 0 ios beg inGradeFile seekg 0 ios beg while inGradeFile eof while inGradeFile eof inGradeFile read charinGradeFile read char st cout obj num obj name obj addr n cout obj num obj name obj addr n cout cout inGradeFile close inGradeFile close returnreturn 0 0 ofstream ofstream 的析构函数将关闭文件的析构函数将关闭文件 程序运行结果如下 程序运行结果如下 111111 aaaaaa vvvvvvvvvvvvvvvvvvvvvvvv 222222 bbbbbb dddddddddddddddddddddd 333333 cccccc mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm Z Z 111aaavvvvvvvvvvvv111aaavvvvvvvvvvvv 222bbbddddddddddd222bbbddddddddddd 333cccmmmmmmmmmmmmmmm333cccmmmmmmmmmmmmmmm 333cccmmmmmmmmmmmmmmm333cccmmmmmmmmmmmmmmm 注意 输出多了一行 为什么 注意 输出多了一行 为什么 文件指针文件指针 文件指针分 文件指针分 读指针和写指针 读指针和写指针 读指针 读指针 用于读过程中定位文件中的对象 在用于读过程中定位文件中的对象 在 ifstreamifstream 可以用成员函数 可以用成员函数 seekg seekg 来定位读来定位读 指针 指针 seekgseekg 函数 函数 原型 原型 ifstreamorg 功能 将读指针定位在从功能 将读指针定位在从 seek dirseek dir orgorg 开始且偏移量为开始且偏移量为 file offsetfile offset 处 处 streamoffstreamoff 类型在类型在 iostream hiostream h 中定义 中定义 seek dirseek dir orgorg 的取值为 的取值为 ios begios beg 文件开始处文件开始处 ios endios end 文件结束处文件结束处 ios curios cur 当前位置当前位置 写指针 写指针 14 用于写过程中定位文件中的对象 在用于写过程中定位文件中的对象 在 ofstreamofstream 可以用成员函数 可以用成员函数 seekp seekp 来定位写来定位写 指针 指针 seekpseekp 函数 函数 原型 原型 ofstreamorg 功能 将写指针定位在从功能 将写指针定位在从 seek dirseek dir orgorg 开始且偏移量为开始且偏移量为 file offsetfile offset 处 处 streamoffstreamoff 类型在类型在 iostream hiostream h 中定义 中定义 seek dirseek dir orgorg 的取值为 的取值为 ios begios beg 文件开始处文件开始处 ios endios end 文件结束处文件结束处 ios curios cur 当前位置当前位置 程序举例 程序举例 include include stdafx h stdafx h include include include include include include structstruct st st charchar num 10 num 10 charchar name 30 name 30 charchar addr 40 addr 40 intint main main staticstatic structstruct stst obj obj ifstreamifstream inGradeFile inGradeFile inGradeFile open C grade2 dat ios in inGradeFile open C grade2 dat ios in cout cout inGradeFile seekg 1 sizeof structinGradeFile seekg 1 sizeof struct st ios beg st ios beg while inGradeFile eof wh

温馨提示

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

最新文档

评论

0/150

提交评论