C文件和IO流final课稿实用_第1页
C文件和IO流final课稿实用_第2页
C文件和IO流final课稿实用_第3页
C文件和IO流final课稿实用_第4页
C文件和IO流final课稿实用_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C文件和IO流final课稿实用主要内容C++中,文件组织记录的两种方式顺序文件方式(ASCII码文件)随机存取文件方式(二进制文件)文件的创建、读写、定位等基本操作(重点)如何利用文件完成事务处理(难点)I/O流库常见的流操纵符及其用法第1页/共45页数据的层次第2页/共45页记录的组织方式有许多种在文件中组织记录的方法顺序文件随机存取文件顺序文件中记录一般按照关键字的顺序进行存放每条记录不等长随机存取文件能实现在常数时间内存取文件中的某条记录最常见的一种实现方式是将每条记录视为等长进行存取这是利用文件进行事务处理采用的主要方式第3页/共45页文件和流C++将每个文件看成是字符序列。每个文件都以文件结束符结尾C++的I/O是以一连串的字节流的方式进行输入操作中,字节从设备(键盘、磁盘驱动器、网络连接)流向内存输出操作中,字节从内存流向设备(显示器、打印机、磁盘驱动器、网络连接)字节可以组成字符、原始数据、图形图像、音频、视频在C++中执行一个文件处理,必须包含文件<iostream>、<fstream>第4页/共45页IO流库的类(模板)层次结构第5页/共45页I/O流库中常用的typedef2023/1/17第6页/共45页I/O流库3个全局标准流对象cin(istream类)从标准用户终端(键盘)读入数据cin>>x,代表数据移动方式是从终端移动到变量x中cout(ostream类)向标准用户终端(显示器)写数据cout<<x,代表数据移动方式是从变量x移动到终端cerr(ostream类)标准错误的ostream对象,是导出程序错误消息的地方,默认仍导出至显示器且是非缓冲式输出clog(ostream类)向标准用户终端(显示器)写日志信息,缓冲式输出第7页/共45页文件的打开通过创建ifstream、ofstream、fstream对象来操纵文件ofstream对象向文件输出数据,其打开方式默认为ios::out,该打开方式在打开已存在的文件时,文件中原来存在的数据都将丢失ifstream对象从文件读取数据,其打开方式默认为ios::infstream对象以读写方式打开文件通过文件流对象完成数据的读写操作结合运算符<<、>>完成,格式为:ofstream对象<<数据ifstream对象>>数据第8页/共45页文件打开模式第9页/共45页比较ios::app和ios::ateios::appapp代表append,该方式每次写入的内容均位于文件末尾ios::ateate代表attheend,该方式第一次写入的内容在文件末尾,但随后写入的位置是当前位置2023/1/17第10页/共45页顺序文件的创建#include<iostream>#include<fstream>#include<string>#include<cstdlib>usingnamespacestd;intmain(){

ofstreamoutClientFile("Client.dat",ios::out); if(!outClientFile)//什么时候文件打开会失败?

{ cerr<<"Filecannotbeopened."<<endl; exit(EXIT_FAILURE); }第11页/共45页intid; stringname; doublebalance; cout<<"inputidnameandbalanca:\n"; cout<<"enterctrl+ztoendinput.\n"; while(cin>>id>>name>>balance) {

outClientFile<<id<<''<<name<<''<<balance<<endl; } return0;}//思考1:循环何时结束?//思考2:为什么没有关闭文件的代码?第12页/共45页说明文件打开失败的情况很多,如:尝试打开并读取不存在的文件在没有权限的情况下对文件进行读写打开文件并写入数据时,磁盘空间不足ofstream对象可以在没有打开特定文件的情况下被创建,再通过成员函数open打开一个文件,并将其关联到已存在的ofstream对象上outClientFile.open("Client.dat",ios::out);主函数终止时,将隐式调用outClientFile的析构函数关闭文件Client.dat,也可通过成员函数close显示关闭ofstream对象,减少资源占用第13页/共45页顺序文件的读出#include<iostream>#include<iomanip>#include<fstream>#include<string>#include<cstdlib>usingnamespacestd;intmain(){

ifstreaminClientFile("Client.dat",ios::in);//最小权限 if(!inClientFile)//重载operator!() { cerr<<"Filecannotbeopened."<<endl; exit(EXIT_FAILURE); }第14页/共45页 intid; stringname; doublebalance; cout<<left<<setw(8)<<"id" <<setw(10)<<"name" <<setw(13)<<"balance"<<endl; while(inClientFile>>id>>name>>balance) { cout<<left<<setw(8)<<id <<setw(10)<<name <<setw(13)<<balance<<endl; } return0;}第15页/共45页思考思考能否修改顺序文件中的记录,如:原纪录:1Elly0.0修改为:1Elizabeth0.0由于顺序文件是将每条记录中的数据按照字符进行存储,故每条数据不等长,故上述修改会破坏该记录之后的数据,可见,格式化的输入/输出通常不用于更新数据第16页/共45页文件定位ifstream类的文件重定位函数seekg()每个ifstream对象都有一个get(读取)指针指出文件中下一个输入的字节号tellg返回当前get指针的位置ofstream类的文件重定位函数seekp()每个ofstream对象都有一个put(写入)指针指出文件中下一个输入的字节号tellp返回当前get指针的位置第17页/共45页seekg用法示例ios::beg

Seekfromthebeginningofthestream.

ios::cur

Seekfromthecurrentpositioninthestream.

ios::end

Seekfromtheendofthestream.第18页/共45页随机存取文件随机存取文件一种较容易的实现方式是保证文件中的所有记录拥有相同长度,即第19页/共45页成员函数write和readwrite函数原型ostream::write(charconst*,int)从内存指定位置输出固定数目的字节到指定的浏Write在文件中从“put”文件定位指针指定的位置开始写入数据read函数原型istream::read(char*,int)在文件中由get文件定位指针所指定的位置读取字节数据2023/1/17第20页/共45页随机文件的写入#ifndefCLIENT_H#defineCLIENT_H#include<string>usingnamespacestd;classClient{public: Client(intidValue=0,stringnameString="",doublebalanceValue=0.0) { id(idValue); name(nameString); balance(balanceValue); } intid()const{return_id;} stringname(){return_name;} doublebalance()const{return_balance;} voidid(intidValue){_id=idValue;} voidname(stringnameString){strcpy(_name,nameString.c_str());} voidbalance(doublebalanceValue){_balance=balanceValue;}protected: int_id;

char_name[20]; double_balance;};#endif第21页/共45页#include<iostream>#include<iomanip>#include<fstream>#include"Clinet.h"#include<cstdlib>usingnamespacestd;intmain(){ intid; stringname; doublebalance; ofstreamoutCredit("Credit.dat",ios::out|ios::binary); if(!outCredit) { cerr<<"Filecannotbeopened."<<endl; exit(EXIT_FAILURE); }第22页/共45页cout<<"Enterid(1to100,0toendinput)\n?"; Clientclient; cin>>id; while(id>0&&id<=100) { cout<<"Enternamebalance:\n"; cin>>name; cin>>balance; client.id(id); (name); client.balance(balance); outCredit.seekp((client.id()-1)*sizeof(client)); outCredit.write(reinterpret_cast<constchar*>(&client),sizeof(client)); cout<<"Enterid:\n"; cin>>id; } return0;}第23页/共45页注意记录的录入顺序是随机的第24页/共45页详解输出操作符<<<<是双目运算符,采用左结合性,语法格式:输出流对象<<C++内置数据类型输出表达式的计算结果是<<的左操作数,也就是说表达式的结果经常是cout自己endl是ostream操作符,它把一个换行符插入到流中,然后再刷新ostream缓冲区ends是ostream操作符,它向标准输出流输出空字符flush是ostream操作符,它用于清空输出缓冲区ws是ostream操作符,它读取并丢弃输出流中的空白字符(空格、回车、换行、制表符、走纸符)第25页/共45页详解输入操作符>>>>是双目运算符,采用左结合性,语法格式:输入流对象>>C++内置数据类型一般情况下,输入操作符在输入多个数据时,会丢弃空白符号当遇到文件结束或者无效值时,cin的值为false第26页/共45页确保输入的健壮性#include<iostream>usingnamespacestd;intmain(){intx;cin>>x;if(!cin)//若输入无效,cin返回false

{ cerr<<"inputwrongdata!"<<endl; return1; } cout<<x<<endl;return0;}第27页/共45页C++中字符串的输入#include<iostream>usingnamespacestd;intmain(){ constintSIZE=80; charbuffer1[SIZE];charbuffer2[SIZE]; cout<<"Enterasentence:"<<endl;cin>>buffer1; cout<<"\nThestringreadwithcinwas:"<<endl<<buffer1<<endl<<endl;

cin.get(buffer2,SIZE);

cout<<"Thestringreadwithcin.getwas:"<<endl<<buffer2<<endl;return0;}第28页/共45页#include<iostream>usingnamespacestd;intmain(){ constintSIZE=80; charbuffer[SIZE];

cout<<"Enterasentence:"<<endl;

cin.getline(buffer,SIZE);

cout<<"\nThesentenceenteredis:"<<endl<<buffer<<endl; return0;}第29页/共45页说明cin>>字符数组名当遇到空白字符时,终止读入字符串cin.get(buffer,count,t)读入count-1个字符到buffer中,当遇到分隔符t时,终止字符串读入,默认分隔符t是’\n’该函数将字符串末尾的空字符自动插入buffer中cin.getline(buffer,count,t)读入count-1个字符到buffer中,当遇到分隔符t时,终止字符串读入该函数将输入流中的分隔符删除,且未将分隔符存储于缓冲区中第30页/共45页请自行查阅以下函数用法peekputbackignore第31页/共45页重载<<和>>C++原有的>>和<<只能用于输出和输入原有的数据类型,不能完成用户自定义类型如复数类、分数类的输入和输出可以重载>>和<<运算符,完成用户自定义数据的输入和输出重载格式:ostream&operator<<(ostream&os,const用户自定义类型&c)第32页/共45页复数类重载<<classComplex //复数类{public:Complex(doubler=0.0,doublei=0.0){real=r;image=i;}constdoubleReal(){returnreal;} constdoubleImag(){returnimage;}

friendComplexoperator+(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c1,constComplex&c2);

friendostream&operator<<(ostream&os,constComplex&c);friendistream&operator>>(istream&is,constComplex&c);Complex&operator=(constComplex&c);private:doublereal,image;};第33页/共45页ostream&operator<<(ostream&os,constComplex&c){ os<<'('<<c.real<<','<<c.image<<"i)"; returnos;}istream&operator>>(istream&is,constComplex&c){ is>>c.real>>c.image; returnis;}第34页/共45页intmain(){//定义一个复数对象c1,其实部为2,虚部为2.5Complexc1(2,2.5);Complexc2(3,1.4);Complexc3,c4;

c3=c1+c2;c4=c1-c2;

cout<<c3<<endl;//重载operator<< cout<<c4<<endl; return0;}第35页/共45页按进制显示数#include<iostream>usingnamespacestd;voidmain(){ intival=16; doubledval=16.0; cout<<"ival:"<<ival <<"octset:"<<oct<<ival<<"\n"; cout<<"dval:"<<dval <<"hexset:"<<hex<<dval<<"\n"; cout<<"ival:"<<ival <<"decset:"<<dec<<ival<<"\n";}第36页/共45页浮点精度#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain(){doubleroot2=sqrt(2.0); intplaces; cout<<"Squarerootof2withprecisions0-9."<<endl <<"Precisionsetbyios_basememberfunctionprecision:\n";

cout<<fixed;//若改成cout<<scientific??? for(places=0;places<=9;places++) { cout.precision(places); cout<<root2<<endl; } cout<<"\nPrecisionsetbystreammanipulatorsetprecision:\n"; for(places=0;places<=9;places++) cout<<setprecision(places)<<root2<<endl;}第37页/共45页showpoint#include<iostream>usingnamespacestd;intmain(){ cout<<"Beforeusingshowpoint"<<endl <<"9.9900printas:"<<9.9900<<endl <<"9.9000printas:"<<9.9000<<endl <<"9.0000printas:"<<9.0000<<endl<<endl;

cout<<showpoint<<"afterusingshowpoint"<<endl <<"9.9900printas:"<<9.9900<<endl <<"9.9000printas:"<<9.9000<<endl <<"9.0000printas:"

温馨提示

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

评论

0/150

提交评论