面向对象程序设计(C++)课件 第6章 C++输入输出流和文件读写_第1页
面向对象程序设计(C++)课件 第6章 C++输入输出流和文件读写_第2页
面向对象程序设计(C++)课件 第6章 C++输入输出流和文件读写_第3页
面向对象程序设计(C++)课件 第6章 C++输入输出流和文件读写_第4页
面向对象程序设计(C++)课件 第6章 C++输入输出流和文件读写_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

大学计算机基础教学系列教材第六章C++输入输出流和文件读写2026年5月11日目录标准I/O库第6.1节标准输入输出流第6.2节文件流第6.3节CONTENTS条件状态第6.4节字符串流第6.5节本章小结第6.6节0102030405062学习目标

理解C++三类输入输出流(标准I/O、文件流、字符串流)及对应头文件。

掌握cin/cout操作、文件流“打开-读写-关闭”全流程。

掌握流状态管理函数(good()/eof()/clear()等)的使用。能运用字符串流处理字符串,编写基础I/O代码。标准I/O库013第6.1节4标准输入输出也称作控制台输入输出,定义于<iostream>头文件中,用于和标准输入输出进行交互。字符串流类定义在<sstream>头文件中,其作用是把string当作流来处理。文件流类定义在<fstream>头文件中,用于将文件当作流来进行读写。核心流类型与头文件流类别头文件包含类/对象核心功能标准控制台I/O<iostream>cin(istream实例)、cout(ostream实例)与键盘(输入)、显示器(输出)交互字符串流<sstream>istringstream、ostringstream、stringstream把string当作流读写,用于数据解析/格式化文件流<fstream>ifstream、ofstream、fstream把文件当作流读写,用于文件操作5各流类型详解标准输入输出:cin:默认与标准输入(键盘)相关联,用于读取用户输入的内容。cout:默认与标准输出(显示器)相关联,用于输出数据。字符串流:istringstream:将已有字符串作为输入流,提取数据(如从字符串拆单词)。ostringstream:将数据格式化写入字符串(如拼接带格式的文本)。stringstream:同时支持字符串读写。文件流:ifstream:仅读取文件数据;ofstream:仅向文件写入数据。fstream:同一文件可读写。6缓冲区机制输出流缓冲触发条件:缓冲区已满。遇到endl或显式调用flush()。程序结束,真正将数据写入终端或文件。输入流缓冲:预先从设备读取一块数据存缓冲区,后续读取直接取缓冲,减少底层I/O调用次数。合理利用刷新缓冲操作,能够显著提高程序性能并精确控制输出时机。标准输入输出流027第6.2节#include<iostream>usingnamespacestd;intmain(){intage;cout<<"请输入您的年龄:";cin>>age;#将用户输入的内容读取到变量age中cout<<"您输入的年龄是:"<<age<<endl;return0;}8标准输入流cin从键盘读取数据,用>>提取,自动转换变量类型。输入时,自动忽略空格、制表符、换行符,直至输入一个完整的整数。cin会自动依据变量类型进行转换,输入类型不匹配则进入错误状态。输出结果:请输入您的年龄:22您输入的年龄是:229标准输出流coutcout需与插入操作符(<<)协同,可通过多个<<连续输出字符串、整数等不同类型数据。使用endl时,兼具“输出内容换行”和“主动刷新输出缓冲区(将数据写入显示器)”两个功能。输出流会依据数据类型自动格式化,无需手动配置格式。#include<iostream>usingnamespacestd;intmain(){stringname="Alice";intscore=95;cout<<"学生姓名:"<<name<<endl;cout<<"考试成绩:"<<score<<endl;return0;}输出结果:学生姓名:Alice考试成绩:95#include<iostream>usingnamespacestd;intmain(){charch1,ch2;cout<<"请输入两个字符(用空格隔开):";cin>>ch1;10字符输入函数cin.get(char&)cin.get(char&)是cin的成员函数,非格式化输入,可读取所有字符(含空格、换行、制表符)。适用于逐字符处理输入(如读含空格文本、解析特定格式数据)。与cin>>区别:cin>>忽略空白字符,cin.get(char&)不忽略。用cin>>后需用cin.get()丢弃缓冲区换行符,避免cin.get(char&)误读。cin.get();//读取并丢弃换行符cin.get(ch2);cout<<"第一个字符是:"<<ch1<<endl;cout<<"第二个字符是:"<<ch2<<endl;return0;

}11字符输入函数cin.get(char&)输出结果:请输入两个字符(用空格隔开):ab第一个字符是:a第二个字符是:b#include<iostream>#include<string>#include<vector>usingnamespacestd;intmain(){cout<<"输入3行字符串:"<<endl;vector<string>words;for(inti=0;i<3;i++){stringword="";12getline()函数getline()可解决cin>>按空格分隔的问题,支持换行或自定义符号分隔。不指定分隔符时,getline()按换行读整行文本(含行内空格)。指定第三个参数(如'|'),getline()可按该字符分隔输入。适用于读含空格完整行(如姓名、地址)或解析特定分隔数据。getline(cin,word);words.push_back(word);

}cout<<"打印输入的字符串:"<<endl;for(inti=0;i<3;i++){cout<<words[i]<<endl;

}cout<<"输入用|分隔的几个字符串:"<<words.clear();for(inti=0;i<3;i++){stringword="";getline(cin,word,'|');//显式指定分隔符words.push_back(word);

}cout<<"打印输入的字符串:"<<endl;for(inti=0;i<3;i++){cout<<words[i]<<endl;

}return0;

}13getline()函数输入3行字符串:HelloWorldC++StreamsDemoProgram打印输入的字符串:HelloWorldC++StreamsDemoProgram输入用|分隔的几个字符串:Apple|Banana|Cherry|Date打印输入的字符串:AppleBananaCherry14getline()函数输出结果:文件流0315第6.3节16文件打开文件流所有功能定义在<fstream>头文件中,含3类核心流:ifstream(读)、ofstream(写)、fstream(读写)。支持“打开文件→I/O操作→关闭文件”的完整流程。默认打开模式:ifstream用in、ofstream用out、fstream用in+out。文件模式组合可通过位或(|)操作符实现。类别用途所属类ifstream读取文件istream派生ofstream向文件写入数据ostream派生fstream既可读又可写iostream派生17文件打开打开文件时,可使用open()函数,并指定文件模式(FileMode)以对文件进行不同的操作,具体内容如下表所示。对象/函数类型主要用途是否用于文件操作ifstreamofstreamfstreamapp文件模式往文件尾部写数据√×√√ate文件模式直接定位到文件尾部√√√√binary文件模式二进制I/O操作√√√√in文件模式读文件√√×√out文件模式写文件√×√√trunc文件模式写文件前清空文件√×√√#include<iostream>#include<string>#include<fstream>usingnamespacestd;intmain(){stringword="HelloWorld";18cerr是C++标准库中预定义的标准错误输出流对象,定义于头文件<iostream>中,属于ostream类型。其作用是向标准错误设备(通常为控制台)输出错误信息或诊断信息,以提示用户程序执行过程中的异常情况。向文件appfile.txt中循环写入5次特定字符串,每次写入后换行,示例代码如下:文件打开for(inti=0;i<5;i++){ofstreamfile("appfile.txt",app);//按位组合模式可写为ios::out|ios::appif(!file){cerr<<"输出文件无法打开!"<<endl;return-1;}file<<word<<endl;file.close();//清除文件流状态file.clear();}return0;}19文件打开20文件打开程序在循环过程中多次以app模式打开文件、写入数据,随后关闭文件。每次打开文件是在上一次写入结果的基础上继续添加数据。注意:文件和文件流是两个不同的概念,当使用同一个文件流对象打开两个不同的文件时,前一个文件的文件模式不会延续到第二个文件,而是需要重新指定文件模式,或者采用默认的文件模式。程序输出如下:HelloWorldHelloWorldHelloWorldHelloWorldHelloWorld21文件关闭及时关闭文件,既能释放系统资源,又能确保数据完整写入磁盘。在C++里,可借助文件流对象的close()成员函数来关闭文件,其语法如下:文件流对象.close();一个简单示例,先向文件输出数据,再关闭输出流:ofstreamout("log.txt");out<<"程序开始执行..."<<endl;out.close();22文件操作文件操作涵盖了读取或写入操作,不同的文件流对象具备不同的操作方式:写入文件(使用ofstream或fstream)的操作借助输出操作符<<来实现。可写入的数据类型包括基本数据类型、字符串等,并且能够按格式输出。若文件已存在,out模式会清除原有内容;若希望追加内容,则需使用app模式。ofstreamoutfile("data.txt");//默认模式outoutfile<<"Name:Alice"<<endl;outfile<<"Score:95"<<endl;outfile.close();23文件操作读取文件(使用ifstream或fstream)的方式有多种,常见的有以下三种:stringname;intage;ifstreaminfile("info.txt");infile>>name>>age;infile.close();使用>>提取操作符(忽略空格与换行):24文件操作运用getline()函数读取包含空格的整行文本:stringline;ifstreaminfile("article.txt");while(getline(infile,line)){cout<<line<<endl;}infile.close();运用get()函数逐个字符进行读取(此方式适用于更精细的粒度控制):charch;ifstreaminfile("text.txt");while(infile.get(ch)){cout<<ch;}infile.close();25文件操作从输入文件infile.txt中读取所有单词,并将单词逐个写入outfile.txt输出文件中:#include<iostream>#include<string>#include<fstream>usingnamespacestd;intmain(){ ifstreaminfile(“infile.txt”);//创建文件流对象并打开文件 if(!infile){cerr<<"输入文件无法打开!"<<endl;return-1;}ofstreamoutfile(“outfile.txt”);//先创建输出文件流再分别打开的语法 if(!outfile){cerr<<"输出文件无法打开!"<<endl;return-1;}//输入文件内容(infile.txt):Thequickbrownfoxjumpsoverthelazydog//输出文件内容(outfile.txt):Thequickbrownfoxjumpsoverthelazydog26文件操作程序输出如下: stringword="";//读取输入文件中的所有单词 while(infile>>word){//并输出到输出文件中去outfile<<word<<"";} infile.close();//用完之后分别关闭两个文件 outfile.close();return0;}输出结果:27文件操作文件流的使用即打开,操作,关闭文件,“文件路径”可分为以下三种:绝对路径:从系统根目录开始,全局唯一、不依赖当前目录,可跨目录/程序使用。在不同的操作系统中,其表示方式不同:①Windows系统中以盘符开头。例如C:\Users\Admin\Documents\data.txt②Unix/Linux/Mac系统中以斜杠/开头。例如/home/user/documents/data.txt相对路径:相对于当前工作目录,依赖程序运行目录,不从根目录开始,例如:①./data.txt表示当前目录下的data.txt文件;②../input/file.txt表示当前目录的上一级目录中的input/file.txt文件。默认路径:仅写文件名,默认读取当前目录文件,程序运行前需在源文件目录建好输入输出文件。28文件操作对文件file1.txt是否存在且可被程序访问进行验证,以下是示例代码:#include<iostream>#include<string>#include<fstream>usingnamespacestd;intmain(){fstreaminfile("file1.txt");if(!infile){cerr<<"输入文件无法打开!"<<endl;return-1;}infile.close();return0;}未关闭前一个文件就打开下一个

(如file2.txt)会报错。因可能引发冲突,操作系统通过文件句柄和锁(共享/独占)管理访问。仅用close关闭文件未必能顺利操作下一个文件:close不重置流状态,需配合clear()函数。29文件操作

从两个文本文件(file1.txt和file2.txt)中读取所有单词,合并存储后输出到屏幕。以下是示例代码:#include<iostream>#include<string>#include<fstream>#include<vector>usingnamespacestd;intmain(){fstreamfile("file1.txt"); //同时能够输入输出的文件if(!file){ cerr<<"输入文件无法打开!"<<endl;return-1;}vector<string>words; 30文件操作stringword=""; while(file>>word){ words.push_back(word);}

file.close(); file.clear(); //清除文件流状态file.open("file2.txt"); if(!file){ cerr<<"输入文件无法打开!"<<endl;return-1;}while(file>>word){words.push_back(word);}file.close();for(inti=0;i<words.size();i++){cout<<words[i]<<"";}return0;}程序输出如下://file1.txt内容:C++ispowerful//file2.txt内容:butrequirescarefulmemorymanagement//程序输出:C++ispowerfulbutrequirescarefulmemorymanagement31文件流成员函数函数作用is_open()检查文件是否成功打开eof()检查是否到达文件末尾fail()检查输入输出操作是否失败good()检查流是否处于良好状态clear()清除错误状态标志is_open():检查文件与指定路径是否建立连接,文件不存在/权限受限返回false,需及时错误处理。C++文件流提供了若干成员函数,用于检测文件状态,如下表所示:32文件流成员函数eof():读取到文件末尾返回true,仅用会导致多读一次,需结合实际读取操作检测。fail()/badbit:格式不匹配、流未打开时读写→failbit置位(fail()返回true);badbit对应严重底层错误。good():仅当eofbit、failbit、badbit均未置位时返回true,可综合判断流是否可继续使用。clear():流非良好状态时,调用清除所有错误标志;必要时配合

seekg/seekp重置读写位置,恢复流对象后续操作。条件状态0433第6.4节34条件状态条件状态(ConditionState):输入输出流读写数据时,需状态位记录管理状态。状态标志值文件状态说明goodbit0状态良好,无错误发生badbit1严重错误,通常是系统级故障(如设备错误)failbit2一般性错误。例如:格式错误,通常可恢复eofbit4文件结束标志,读取到文件末尾时被置位4种核心状态位:goodbit(0):状态正常,无任何错误。badbit(1):出现系统级故障(如设备错误)。failbit(2):发生通常可修复的故障(如格式不匹配)。eofbit(4):读取到文件结束符(EOF)。状态位查询与重置:用good()、bad()、fail()、

eof()查询对应状态。rdstate()返回当前状态值。clear()将状态重置为有效。35文件读取操作如下代码展示了文件读取操作的全流程管理,重点呈现了如何正确打开文件、读取内容、监控流状态以及释放资源,并通过状态检查机制实现安全的文件操作。

输出结果:#include<iostream>#include<string>#include<fstream>usingnamespacestd;intmain(){ifstreaminfile("infile.txt");if(!infile){cerr<<"输入文件无法打开!"<<endl;return-1;}if(infile.good()){cout<<"输入流对象状态为good"<<endl;cout<<"条件状态值:"<<infile.rdstate();}stringword="";//读取文件中的单词while(infile>>word){cout<<word<<",";}cout<<endl;if(infile.eof()){cout<<"输入流对象状态为eof"<<endl;cout<<"条件状态值:"<<infile.rdstate()<<endl;}infile.close();//用完之后关闭文件infile.clear();cout<<"重置状态"<<endl;if(infile.good()){cout<<"输入流对象状态为good"<<endl;cout<<"条件状态值:"<<infile.rdstate()<<endl;}return0;}36文件读取操作37文件读取操作程序输出如下://输入文件内容(infile.txt):C++FileHandlingStreamStates//程序输出:输入流对象状态为good条件状态值:0C++,File,Handling,Stream,States,输入流对象状态为eof条件状态值:3重置状态输入流对象状态为good条件状态值:0成功打开文件:输入流状态为“good”,对应状态值0。文件读取完毕(遇EOF):状态变为“eof”,对应状态值3。状态重置:调用clear()函数,状态恢复为“good”。字符串流0538第6.5节39字符串的分割、重组与状态管理从文件读取文本后,若文本为一行行字符串,可通过字符串流处理。字符串流类定义在`<sstream>`头文件中,含3类:`istringstream`:仅具备输入功能`ostringstream`:仅具备输出功能`stringstream`:兼具输入与输出功能代码通过`istringstream`和`ostringstream`实现字符串的分割、重组与状态管理。1#include<iostream>2#include<string>3#include<sstream>4#include<vector>5#include<fstream>6usingnamespacestd;40第1阶段:istringstream读取处理7intmain(){8cout<<"输入字符串:"<<endl;9stringstr="youknownothingJohnSnow";10istringstreaminStr(str);//不再需要检查流的状态11//使用字符串流特有的函数获得关联的字符串12cout<<inStr.str()<<endl;13vector<string>words;14stringword="";15while(inStr>>word){第10行:istringstream将字符串包装成可读流,模拟控制台/文件读取。第12行:调用inStr.str(),直接获取流关联的原始字符串,验证封装生效。第15行:通过inStr>>word提取空白分隔的单词,存入words数组。41第2阶段:ostringstream写入与更新23cout<<"输出字符串:"<<endl;24cout<<outStr.str()<<endl;25//用带参数的str()重新设置关联字符串26inStr.str(outStr.str());27cout<<"输入字符串:"<<endl;28cout<<inStr.str()<<endl;29return0;}19for(inti=0;i<words.size();i++){20outStr<<words[i]<<"_";21}22cout<<"转换完成!"<<endl;16words.push_back(word);17}18ostringstreamoutStr;42第2阶段:ostringstream写入与更新23cout<<"输出字符串:"<<endl;24cout<<outStr.str()<<endl;25//用带参数的str()重新设置关联字符串26inStr.str(outStr.str());27cout<<"输入字符串:"<<endl;28cout<<inStr.str()<<endl;29return0;}19for(inti=0;i<words.size();i++){20outStr<<words[i]<<"_";21}22cout<<"转换完成!"<<endl;16words.push_back(word);17}18ostringstreamoutStr;输入字符串:youknownothingJohnSnow转换完成!输出字符串:you_know_nothing_John_Snow_输入字符串:you_know_nothing_John_Snow_43字符串的分割、重组与状态管理程序输出如下:第20行:outStr将单词与下划线连接,生成新格式化字符串。第24行:通过outStr.str()获取并展示转换结果。第26行:用带参数的str(),将outStr的新字符串赋值给inStr,更新输入流内容。第28行:再次调用inStr.str(),验证新数据加载成功,可继续后续处理。交互式加减法计算器交互式加减法计算器,支持用户多次输入算术表达式并实时计算结果,通过字符串流解析表达式,以下是示例代码:1#include<iostream>2#include<string>3#include<sstream>4#include<vector>5usingnamespacestd;6intmain(){7//重复使用流对象8istringstreaminStr;9charcmd='c';10while(cmd!='q'){11cout<<"请输入命令字符,q退出,c继续:"<<endl;12cin>>cmd;4445交互式加减法计算器第19-22行:程序通过循环接收用户命令,每次输入类似“2+3+3”的运算表达式。13if(cmd=='q'){14break;15}elseif(cmd!='c'){16cout<<"命令错误,请重新输入!"<<endl;17continue;18}19cout<<"请输入类似“2+3+3”的字符串,数字与操作符之间用空格隔开:"<<endl;20stringstr="";21cin.ignore();//使用getline()之前需要让cin忽略之前的空格或换行22getline(cin,str);46交互式加减法计算器第23行:调用inStr.str(str),将输入文本绑定到同一个istringstream对象。第29行:用状态变量isNum控制流对象,轮流读取整数和操作符。29while(isNum?(inStr>>num):(inStr>>op)){30if(isNum){23inStr.str(s

温馨提示

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

评论

0/150

提交评论