程序设计原理输入输出流和文件操作_第1页
程序设计原理输入输出流和文件操作_第2页
程序设计原理输入输出流和文件操作_第3页
程序设计原理输入输出流和文件操作_第4页
程序设计原理输入输出流和文件操作_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、程序设计原理输入输出流和文件操作输入输出流流的概念模型C+中与流操作相关的类及其继承关系输入输出流对象: cin, cout, cerr, clog输出流输入流无格式输入输出流操纵算子流格式状态流的概念模型流 - 可以看作一个无限长的二进制数字序列通过读写指针进行流的读和写(以字节为单位) 1010111010101110将流上的数据读进变量x1010111011100010将y的值写入流yx流的概念模型输出流 可以看作一端无限,另一端通过写指针不停地向后写入新内容的单向流,1100011010写指针流的概念模型输入流 可以看作一端无限,另一端通过读指针不停地从流中读取新内容的单向流,读出的内

2、容从流中删去。1100011010读指针有格式读写和无格式读写字符方式/二进制方式读写有格式读写,以某种数据类型为单位读写例如:读一个整数,写一个浮点数等;无格式读写,以字节为单位读写,不区分其中的内容例如:读20个字节,写50个字节等;缓冲区刷新向输出流中写数据时,通常是先向缓冲区中写,当缓冲区写满时,才真正向输出流写;也可以通过函数在程序中主动将缓冲区内容写入输出流。C+中与流操作相关的类及其继承关系iosistreamostreamifstreamiostreamofstreamfstream标准流对象输入流对象: cin 与标准输入设备相连输出流对象:cout 与标准输出设备相连 ce

3、rr 与标准错误输出设备相连 非缓冲输出 clog 与标准错误输出设备相连 缓冲输出 输出流流插入运算符 cout “Good morning!n”; 不刷新缓冲区 cout “Good”; 不刷新缓冲区 cout “morning!”; 不刷新缓冲区 cout endl; 刷新缓冲区 cout 运算符的定义: istream &operator (istream &input, A & a) . return input; 返回的是输入流的引用(引用本身是地址),在读取不成功时, 该地址被置成 0. 所以可以用如下方法判输入结束: int x; while(cinx) 输入流成员函数 cin

4、.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() 返回输入是否结束标志.输入流其它函数cin.peek(); 返回下一个字符,但不从流中去掉.putback(char ch); 将字符c

5、h放回输入流ignore( int nCount = 1, int delim = EOF ); 从流中删掉最多nCount个字符,遇到EOF时结束。无格式输入输出用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 functions 输出:Using the read,write流

6、操纵算子整数流的基数:流操纵算子dec,oct,hex,setbase浮点数的精度(precision,setprecision)设置域宽(setw,width)用户自定义的流操纵算子使用流操纵算子需要 #include 流操纵算子整数流的基数:流操纵算子dec,oct,hex int n = 10; cout n endl; cout hex n “n” dec n “n” oct n setprecision(5); / 可以连续输出它们的功能相同。指定输出浮点数的有效位数 浮点数输出最多6位有效数字#include #include using namespace std;int mai

7、n()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+00612 以小数点位置固定的方式输出#include #include using namespace std;int main()double x = 1234567.89,y = 12.34567;int n = 1234567;int m = 12;cout setiosflags(ios:fixed) setpreci

8、sion(6) x endl y endl n endl m;控制浮点数精度的流操纵算子输出:12 取消以小数点位置固定的方式输出#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 cout.width(w+); cout string string; 567890 cout

9、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 & ) ) ;文件操作数据的层次文件和流建立顺序文件文件的读写指针有格式读写无格式读写

10、数据的层次位 bit字节 byte域/记录例如:学生记录 int ID; char name10; int age; int rank10;我们将所有记录顺序地写入一个文件,称为顺序文件。 文件和流可以将顺序文件看作一个有限字符构成的顺序字符流,然后象对cin, cout 一样的读写。回顾一下输入输出流类的结构层次:iosistreamostreamifstreamiostreamofstreamfstream建立顺序文件#include / 包含头文件ofstream outFile(“clients.dat”, ios:out|ios:binary); /打开文件ofstream 是 fs

11、tream中定义的类outFile 是我们定义的ofstream类的对象“clients.dat”是将要建立的文件的文件名ios:out 是打开并建立文件的选项ios:out 输出到文件, 删除原有内容ios:app 输出到文件, 保留原有内容,总是在尾部添加ios:ate 输出到文件, 保留原有内容,可以在文件任意位置添加 ios:binary 以二进制文件格式打开文件建立顺序文件也可以先创建ofstream对象,再用 open函数打开 ofstream fout; fout.open(test.out,ios:out|ios:binary);判断打开是否成功: if(!fout)cerr

12、“ error!”endl;文件的读写指针对于输入文件,有一个读指针;对于输出文件,有一个写指针;对于输入输出文件,有一个读写指针;标识文件操作的当前位置, 该指针在哪里,读写操作就在哪里进行。文件的读写指针ofstream fout(“a1.out”,ios:ate);long location = fout.tellp(); /取得写指针的位置location = 10L;fout.seekp(location); / 将写指针移动到第10个字节处fout.seekp(location,ios:beg); /从头数locationfout.seekp(location,ios:cur);

13、/从当前位置数locationfout.seekp(location,ios:end); /从尾部数locationlocation 可以为负值文件的读写指针ifstream fin(“a1.in”,ios:ate);long location = fin.tellg(); /取得读指针的位置location = 10L;fin.seekg(location); / 将读指针移动到第10个字节处fin.seekg(location,ios:beg); /从头数locationfin.seekg(location,ios:cur); /从当前位置数locationfin.seekg(locati

14、on,ios:end); /从尾部数locationlocation 可以为负值字符文件读写因为文件流也是流,所以前面讲过的流的成员函数和流操作算子也同样适用于文件流。写一个程序,将文件 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); i

15、nt 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 ;dest();src();参考程序二进制文件读写int x=10;fout.seekp(20, ios:beg);fout.write(const char *)(&x),sizeof(int);fi

16、n.seekg(0, ios:beg);fin.read(char *)(&x),sizeof(int);二进制文件读写,直接写二进制数据,记事本看未必正确。二进制文件读写/下面的程序从键盘输入几个学生的姓名的成绩,并以二进制/文件形式存起来#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.szNa

17、me s.nScore ) if( stricmp(s.szName,“exit”) = 0) /名字为exit则结束break;Out(char * ) & s, sizeof( s);Out();return 0;输入: Tom 60Jack 80Jane 40exit 0则形成的 students.dat 为 72字节,用 记事本打开,呈现:Tom 烫烫烫烫烫烫烫烫 Jack 烫烫烫烫烫烫烫蘌 Jane 烫烫烫烫烫烫烫?二进制文件读写/下面的程序将 students.dat 文件的内容读出并显示#include #include using namespace std;class CSt

18、udent 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( In( (char* ) & s, sizeof(s) ) int nReadedBytes = In(); /看刚才读了多少字节cout s.szName s.nScore endl;In();return 0; 输出:Tom 60Jack 80Jane 40二进制文件读写/下

19、面的程序将 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;io( 2 * sizeof(s),ios:beg);/定位写指针到第三个记录io(Mike,strlen(Mike);io(0,ios:beg); /定位读指针到开头while( io( (char* ) & s, sizeof(s) ) cout s.szName s.nScore settings-debug -program arguments命令行参数int mai

温馨提示

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

评论

0/150

提交评论