Presentation is loading. Please wait.

Presentation is loading. Please wait.

第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例.

Similar presentations


Presentation on theme: "第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例."— Presentation transcript:

1 第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例

2 9.1流 输出 内存 设备 数据 输入

3 标准输出流 cout cout是系统定义过的ostream类的一个对象,该类提供的多种输出功能都适用于cout,包括:
使用流插入操作符(<<)输出各种数据 通过成员函数put输出字符 通过成员函数write输出字符串 1.成员函数put的使用 格式: 作用为在屏幕上输出一个字符,返回值为ostream类对象的引用,故函数可以连续调用。 字符变量 字符常量 cout.put(char c) cout.put(const char c)

4 例9.1 #include "iostream.h" void main() {char ch='A'; cout.put(ch)<<endl; cout.put('O').put('k')<<endl; } 连续调用 2.成员函数write的使用 格式: 作用是将一个字符串的部分或全部内容在屏幕上输出。 该函数的返回值为ostream类对象的引用,故函数可以连续调用。 字符数组或字符指针 cout.write(const char *str,int n) 输出的字符个数

5 例9.2 #include "iostream.h" #include <string.h> void main() {char *ch="ABCDEFGHIJKLMN"; cout.write(ch,10).put('\n'); //输出该字符串的前10个字符 cout.write(ch,strlen(ch))<<endl;//输出全部字符串 }

6 标准输入流 cin cin是系统定义过的istream类的一个对象,该类提供的多种输入功能都适用于cin,包括: 1.成员函数get的使用
使用流提取操作符(>>)输入数据 通过成员函数get输入字符或字符串 通过成员函数read输入字符串 1.成员函数get的使用 格式: 作用为从键盘上输入一个字符给内存变量ch,返回值为ostream类对象的引用,故函数可以连续调用。 字符变量 cin.get(char ch) ch=cin.get( ) 注意:空白符作为有效字符被读入,不同于使用提取符(>>)

7 cout<<"input a serial of characters:"<<endl;
例9.3 统计字符串中包含的字符个数 #include "iostream.h" void main() {int count=0; char ch; cout<<"input a serial of characters:"<<endl; while((ch=cin.get())!=EOF) // 按ctrl+z结束输入 {cout<<ch; count++; } cout<<count<<endl; 不断输入字符,直到输入结束符 1.观察运行结果 2. 将循环条件改为 cin>>ch 程序结果又如何? 3.对比两种输入方法的区别

8 使用get成员函数读入一行字符串,也可以用成员函数getline实现,形式如下:
cin.get(char *buf,int size,char ch) cin.getline(char *buf,int size,char ch) 存放字符串的字符数组或字符指针 限定最大字符个数不能超过size-1 指定的结束符,该字符不包含在字符串中,默认结束符为‘\n’

9 cout<<"input a string:"<<endl; while((cin.getline(s,50)))
例9.4 找最长串 #include "iostream.h" #include "string.h" void main() {int line,max=0; char s[50],t[50]; cout<<"input a string:"<<endl; while((cin.getline(s,50))) { line=cin.gcount(); //line中存放的是刚刚读入的那行字符串的长度 if(line>max) {max=line; strcpy(t,s); } cout<<"the string of longest line is:"<<endl; cout<<t<<endl; cout<<"it has "<<max<<"characters"<<endl; 输入一行字符串,最大长度不能超过49 若改为cin.getline(s,50, ' ') 结果如何?

10 cin. read(char *buf, int size)
格式: 例9.5 cin. read(char *buf, int size) 读取到字符数组中的字符个数(不同于getline函数) #include "iostream.h" #include "string.h" void main() {char ch[100]; cin.read(ch,10); //读取输入流中的前10个字符到数组ch中 cout<<"\n The string entered is:\n"; cout.write(ch,cin.gcount())<<endl; } 对比cin.getline(ch,10) 的结果

11 9.2 磁盘文件 ifstream类操作文件输入 ofstream类操作文件输出 fstream类操作文件输入 输出 1. 打开文件
创建流类对象的同时打开文件 先创建流类对象、再打开文件 创建的输出流对象 ofstream outfile("abc.dat"); fstream outfile("abc.dat", ios::out); ofstream outfile; outfile.open("abc.dat"); 等价 以输出形式打开文件 创建的输入输出流对象

12 对已正确打开的某文本文件,可以通过对与其相关联的流类对象的如下操作进行读写
2.关闭文件 关闭文件的成员函数 outfile.close(); 已定义的与某磁盘文件相关联的流类对象 3.文本文件的读写 对已正确打开的某文本文件,可以通过对与其相关联的流类对象的如下操作进行读写 使用提取、插入操作 使用成员函数get(含getline)和put 例9.6

13 #include "stdlib.h" #include "iostream.h" #include "fstream.h" void main() {ofstream outfile; outfile.open("abc.txt"); //以写的方式打开文件abc.txt if(!outfile) {cout<<"abc.txt can't open"<<endl; abort(); //打开失败,结束程序 } char ch='a'; while(ch<='z') {outfile<<ch; ch++; outfile.close(); fstream infile("abc.txt",ios::in); //以读的方式打开文件abc.txt while(infile>>ch) cout<<ch; cout<<endl; 检查文件是否正常打开 通过插入操作将内存变量的内容写到文件中 通过提取操作从文件中读数据到内存变量

14 例9.7 #include"iostream.h" #include "fstream.h" #include "stdlib.h"
void main() {char s[100]; ofstream outf; outf.open("f1.dat"); if(!outf) {cout<<"can't open f1.dat"<<endl; abort(); } outf<<"He is a boy.\n"; outf<<"She is a girl.\n"; outf<<"I'm a teacher.\n"; outf.close(); ifstream inf("f1.dat"); while(!inf.eof()) {inf.getline(s,sizeof(s)); cout<<s<<endl; 例9.7 通过插入操作将若干字符串写到文件中 通过getline函数从文件中读一行字符串到数组

15 4.二进制文件的读写 创建流对象或打开文件时需显式声明文件类型为二进制 ios::binary 最常用成员函数read和write实现读写 可使用提取、插入操作完成读写 如: ofstream outfile; outfile.open("file.dat",ios::binary); 或: ofstream outfile("file.dat",ios::binary); 皆表示以二进制模式打开文件“file.dat”,并将其与输出流对象outfile相关联。

16 outfile<<stu[i].num<<stu[i].name<<stu[i].score;
假设有定义: struct student {int num; char name[20]; double score; }stu[5]; ofstream outfile("file.dat",ios::binary); 则可通过如下程序段实现文件的写操作: 将一个记录中的数据都变为字符进行处理 for(int i=0;i<n;i++) { cin>>stu[i].num>>stu[i].name>>stu[i].score; outfile.write((char *)&stu[i],sizeof(struct student)); } 也可通过插入符实现 outfile<<stu[i].num<<stu[i].name<<stu[i].score;

17 通过成员函数定位读写文件指针,实现随机访问
5.随机访问文件 通过成员函数定位读写文件指针,实现随机访问 操作读指针的成员函数: 定位读文件指针位置 istream&istream::seekg(流中位置); istream&istream::seekg(偏移量,参照位置); streampos istream::tellg(); ios::beg 相对于流开始处 ios::cur 相对于当前位置 ios::end 相对于流结尾处 返回读文件指针位置 如,假设inf是一个istream类的流,则: inf.seekg(50,ios::beg);表示使读指针从流开始位置后移50字节 inf.seekg(-50,ios::end); 表示使读指针从流结尾处前移50字节

18 ostream&ostream::seekp(流中位置); ostream&ostream::seekp(偏移量,参照位置);
操作写指针的成员函数: 定位写文件指针位置 ostream&ostream::seekp(流中位置); ostream&ostream::seekp(偏移量,参照位置); streampos ostream::tellp(); 含义同读指针 返回写文件指针位置 利用seekg或seekp定位文件指针后,再调用读写成员函数,便可以实现文件的随机读写,例子见教材p323

19 9.3 程序举例 例9.8 设计程序实现将给定的文本文件在屏幕上分屏显示的功能 #include "iostream.h"
#include "fstream.h" #include "stdio.h" #include "stdlib.h" void main() {int r; char c; char fn[15],buf[100]; fstream file1; cout<<"input the file name:"; cin>>fn;//输入指定的文件名 file1.open(fn,ios::in); if(!file1) {cout<<"can't open the file.\n"; abort(); } while(!file1.eof()) {r=0; //计数器代表已显示在屏幕上文本的行数 while(!file1.eof()&&r<23)//一屏显示24行 {file1.getline(buf,100); //逐行读文件 cout<<buf<<endl; r++; } cout<<"press 'enter' key..."; c=getchar(); //键入回车键后显示下一屏 file1.close();

20 例9. 9 将sin(x)在i(2π/360)(i=0,1,…359)上的值保存在文件dsin
例9.9 将sin(x)在i(2π/360)(i=0,1,…359)上的值保存在文件dsin.dat中,并从该文件中读取数据,以这些数据为基础,计算sin(x)在[0,2π]上的积分。 #include "fstream.h" #include "math.h" #define SIZE 361 #define PI #include "stdlib.h" void main( ) { double data[SIZE],s=0; for (int i=0; i<SIZE; i++) data[i]=sin(2*i*PI/360); fstream file1; file1.open("dsin.dat",ios::out); if(!file1) {cout<<"can't open the file.\n"; abort(); } file1.write ((char*)data, sizeof(data)); file1.close(); file1.open("dsin.dat",ios::in); if(!file1) {cout<<"can't open the file.\n"; abort(); } file1.read((char*)data, sizeof(data)); for (i=0; i<SIZE; i++) s=s+data[i]; s=s*(2*PI/360); cout<<s<<endl; 将sin(x)在0~2π上的值写入文件dsin.dat 梯形法求积分


Download ppt "第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例."

Similar presentations


Ads by Google