程序设计实习概要课件

上传人:仙*** 文档编号:241625344 上传时间:2024-07-10 格式:PPT 页数:51 大小:175.04KB
返回 下载 相关 举报
程序设计实习概要课件_第1页
第1页 / 共51页
程序设计实习概要课件_第2页
第2页 / 共51页
程序设计实习概要课件_第3页
第3页 / 共51页
点击查看更多>>
资源描述
程序设计实习程序设计实习输入输出流和文件操作输入输出流输入输出流l流的概念模型lC+中与流操作相关的类及其继承关系l输入输出流对象:cin,cout,cerr,clogl输出流l输入流l无格式输入输出l流操纵算子l流格式状态流的概念模型流的概念模型l流 -可以看作一个无限长的二进制数字序列l通过读写指针进行流的读和写(以字节为单位)1010111010101110将流上的数据读进变量x1 0 1 0 1 1 1 011100010将y的值写入流yx流的概念模型流的概念模型l输出流 可以看作一端无限,另一端通过写指针不停地向后写入新内容的单向流,1 1 00011010写指针流的概念模型流的概念模型l输入流 可以看作一端无限,另一端通过读指针不停地从流中读取新内容的单向流,读出的内容从流中删去。1 1 00011010读指针有格式读写和无格式读写有格式读写和无格式读写字符方式字符方式/二进制方式读写二进制方式读写l有格式读写,以某种数据类型为单位读写l例如:读一个整数,写一个浮点数等;l无格式读写,以字节为单位读写,不区分其中的内容l例如:读20个字节,写50个字节等;缓冲区刷新缓冲区刷新l向输出流中写数据时,通常是先向缓冲区中写,当缓冲区写满时,才真正向输出流写;也可以通过函数在程序中主动将缓冲区内容写入输出流。C+C+中与流操作相关的类中与流操作相关的类及其继承关系及其继承关系iosistreamostreamifstreamiostreamofstreamfstream标准流对象标准流对象l输入流对象:cin 与标准输入设备相连l输出流对象:cout 与标准输出设备相连 cerr 与标准错误输出设备相连 非缓冲输出 clog 与标准错误输出设备相连 缓冲输出 输出流输出流l流插入运算符 l cout “Good morning!n;不刷新缓冲区l cout “Good;不刷新缓冲区l cout “morning!;不刷新缓冲区l cout endl;刷新缓冲区l cout 运算符的定义:istream&operator(istream&input,A&a).return input;返回的是输入流的引用(引用本身是地址),在读取不成功时,该地址被置成 0.所以可以用如下方法判输入结束:int x;while(cinx)输入流输入流l成员函数 cin.get()读入一个字符(包括空白字符),返回该字符;cin.get(char*buffer,int size,char delim=n)或者读size 1 个字符入buffer,或者遇到n;在buffer最后加0,分隔符留在输入流.cin.getline(char*buffer,int size,char delim=n)或者读size 1 个字符入buffer,或者遇到n;在buffer最后加0,分隔符从流去掉.cin.eof()返回输入是否结束标志.输入流输入流l其它函数cin.peek();返回下一个字符,但不从流中去掉.putback(char ch);将字符ch放回输入流ignore(int nCount=1,int delim=EOF);从流中删掉最多nCount个字符,遇到EOF时结束。无格式输入输出无格式输入输出l用read,write 进行指定字节数的输入输出const int SIZE=80;char bufferSIZE;cin.read(buffer,20);cout.write(buffer,cin.gcount();/gcount返回上次读入的字节数cout endl;输入:Using the read,write and gcount member functionsUsing the read,write and gcount member functions 输出:Using the read,writeUsing the read,write流操纵算子流操纵算子l整数流的基数:流操纵算子dec,oct,hex,setbasel浮点数的精度precision,setprecisionl设置域宽(setw,width)l用户自定义的流操纵算子l使用流操纵算子需要#include 流操纵算子流操纵算子l整数流的基数:流操纵算子dec,oct,hexl int n=10;l cout n endl;l cout hex n “nl dec n “nl oct n setprecision(5);/可以连续输出它们的功能相同。指定输出浮点数的有效位数 浮点数输出最多6位有效数字#include#include using namespace std;int main()double x=1234567.89,y=12.34567;int n=1234567;int m=12;cout setprecision(6)x endl y endl n endl m;控制浮点数精度的流操纵算子输出:1.23457e+006123456712 以小数点位置固定的方式输出#include#include using namespace std;int main()double x=1234567.89,y=12.34567;int n=1234567;int m=12;cout setiosflags(ios:fixed)setprecision(6)x endl y endl n endl m;控制浮点数精度的流操纵算子输出:123456712 取消以小数点位置固定的方式输出#include#include using namespace std;int main()double x=1234567.89;cout setiosflags(ios:fixed)setprecision(6)x endl resetiosflags(ios:fixed)setw(5);或者 cin.width(5);cout string)90 while(cin string)90 cout.width(w+);cout.width(w+);cout string endl;cout string string;567890 cout string string;cout string string;5678 cout string string;cout string endl;用户自定义流操纵算子用户自定义流操纵算子ostream&tab(ostream&output)return output t;cout “aa tab “bb endl;输出:aa bb为什么可以?用户自定义流操纵算子用户自定义流操纵算子因为 iostream 里对 进行了重载(成员函数ostream&operator (ostream&(*p)(ostream&);文件操作文件操作l数据的层次l文件和流l建立顺序文件l文件的读写指针l有格式读写l无格式读写数据的层次数据的层次l位 bitl字节 bytel域/记录例如:学生记录 int ID;char name10;int age;int rank10;l我们将所有记录顺序地写入一个文件,称为顺序文件。文件和流文件和流l可以将顺序文件看作一个有限字符构成的顺序字符流,然后象对cin,cout 一样的读写。回忆一下输入输出流类的结构层次:iosistreamostreamifstreamiostreamofstreamfstream建立顺序文件建立顺序文件l#include /包含头文件lofstream outFile(“clients.dat,ios:out|ios:binary);/翻开文件lofstream 是 fstream中定义的类loutFile 是我们定义的ofstream类的对象l“clients.dat是将要建立的文件的文件名lios:out 是翻开并建立文件的选项lios:out 输出到文件,删除原有内容lios:app 输出到文件,保存原有内容,总是在尾部添加lios:ate 输出到文件,保存原有内容,可以在文件任意位置添加 lios:binary 以二进制文件格式翻开文件建立顺序文件建立顺序文件l也可以先创立ofstream对象,再用 open函数翻开l ofstream fout;l fout.open(test.out,ios:out|ios:binary);l判断翻开是否成功:l if!foutcerr “File open error!endl;文件的读写指针文件的读写指针l对于输入文件,有一个读指针;l对于输出文件,有一个写指针;l对于输入输出文件,有一个读写指针;l标识文件操作的当前位置,该指针在哪里,读写操作就在哪里进行。文件的读写指针文件的读写指针lofstream fout(“a1.out,ios:ate);llong location=fout.tellp();l /取得写指针的位置llocation=10L;lfout.seekp(location);l /将写指针移动到第10个字节处lfout.seekp(location,ios:beg);/从头数locationlfout.seekp(location,ios:cur);/从当前位置数locationlfout.seekp(location,ios:end);/从尾部数locationllocation 可以为负值文件的读写指针文件的读写指针lifstream fin(“a1.in,ios:ate);llong location=fin.tellg();l /取得读指针的位置llocation=10L;lfin.seekg(location);l /将读指针移动到第10个字节处lfin.seekg(location,ios:beg);/从头数locationlfin.seekg(location,ios:cur);/从当前位置数locationlfin.seekg(location,ios:end);/从尾部数locationllocation 可以为负值字符文件读写字符文件读写因为文件流也是流,所以前面讲过的流的成员函数和流操作算子也同样适用于文件流。写一个程序,将文件 in.txt 里面的整数排序后,输出到例如,假设in.txt 的内容为:1 234 9 45 6 879那么执行本程序后,生成的的内容为:1 6 9 45 234 879#include#include#include using namespace std;int cmp(const void*x1,const void*x2)return*(int*)x1)-*(int*)x2);int main()int v100,int i=0,x;ifstream srcFile(in.txt,ios:in);ofstream destFile(out.txt,ios:out);while(srcFile x)vi=x;i+;qsort(v,i,sizeof(int),cmp);for(int j=0;j i;j+)destFile vj ;destFile.close();srcFile.close();参考程序二进制文件读写二进制文件读写lint x=10;lfout.seekp(20,ios:beg);lfout.write(const char*)(&x),sizeof(int);lfin.seekg(0,ios:beg);lfin.read(char*)(&x),sizeof(int);l二进制文件读写,直接写二进制数据,记事本看未必二进制文件读写,直接写二进制数据,记事本看未必正确。正确。二进制文件读写二进制文件读写/下面的程序从键盘输入几个学生的姓名的成绩,并以二进制/文件形式存起来#include#include using namespace std;class CStudent public:char szName20;int nScore;int main()CStudent s;ofstream OutFile(c:tmpstudents.dat,ios:out|ios:binary);while(cin s.szName s.nScore)if(stricmp(s.szName,“exit)=0)/名字为exit那么结束break;OutFile.write(char*)&s,sizeof(s);OutFile.close();return 0;输入:Tom 60Jack 80Jane 40exit 0那么形成的 students.dat 为 72字节,用 记事本翻开,呈现:Tom 烫烫烫烫烫烫烫烫 Jack 烫烫烫烫烫烫烫蘌 Jane 烫烫烫烫烫烫烫?二进制文件读写二进制文件读写/下面的程序将 students.dat 文件的内容读出并显示#include#include using namespace std;class CStudent public:char szName20;int nScore;int main()CStudent s;ifstream InFile(“c:tmpstudents.dat,ios:in|ios:binary);if(!InFile)cout error endl;return 0;while(InFile.read(char*)&s,sizeof(s)int nReadedBytes=InFile.gcount();/看刚刚读了多少字节cout s.szName s.nScore endl;InFile.close();return 0;输出:Tom 60Jack 80Jane 40二进制文件读写二进制文件读写/下面的程序将 students.dat 文件的Jane的名字改成Mike#include#include using namespace std;class CStudent public:char szName20;int nScore;输出:Tom 60Jack 80Mike 40int main()CStudent s;fstream iofile(c:tmpstudents.dat,ios:in|ios:out|ios:binary);if(!iofile)cout error;return 0;iofile.seekg(2*sizeof(s),ios:beg);/定位写指针到第三个记录iofile.write(Mike,strlen(Mike);iofile.seekp(0,ios:beg);/定位读指针到开头while(iofile.read(char*)&s,sizeof(s)cout s.szName s.nScore settings-debug-program arguments命令行参数命令行参数lint main(int argc,char*argv)l cout argc endl;l for(int i=0;iargc;i+)l cout argvi endl;lreturn 0;ll第一个参数为命令本身,第二个以后为参数命令行参数命令行参数假设上面程序可执行文件名为 sampl.exe,那么在命令行输入:smaple file1 a.txt s输出结果为4-v2例子:例子:mycopy 程序,文件拷贝程序,文件拷贝/*用法例如:mycopy src.dat dest.dat 即将 src.dat 拷贝到 dest.dat 如果 dest.dat 原来就有,那么原来的文件会被覆盖*/#include#include using namespace std;int main(int argc,char*argv)if(argc!=3)cout File name missing!endl;return 0;ifstream inFile(argv1,ios:binary|ios:in);/翻开文件用于读if(!inFile)cout Source file open error.endl;return 0;ofstream outFile(argv2,ios:binary|ios:out);/翻开文件用于写if(!outFile)cout New file open error.endl;inFile.close();/翻开的文件一定要关闭return 0;char c;while(inFile.get(c)/每次读取一个字符outFile.put(c);/每次写入一个字符outFile.close();inFile.close();return 0;ifstream inFile(argv1,ios:binary|ios:in);/翻开文件用于读if(!inFile)cout Source file open error.endl;return 0;ofstream outFile(argv2,ios:binary|ios:out);/翻开文件用于写if(!outFile)cout New file open error.endl;inFile.close();/翻开的文件一定要关闭return 0;char c;while(inFile.get(c)/每次读取一个字符outFile.put(c);/每次写入一个字符outFile.close();inFile.close();return 0;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!