9、流类库与输入/输出3.输入流
一个输入流对象是数据流出的源头,三个最重要的流类是istream、ifstream、istringstream。
istream类最适合用于顺序文本模式输入。基类ios的所有功能都包括在istream中。
我们通常使用预先定义的cin对象,它实际上是istream_withassign类的一个对象。
ifstream类支持磁盘文件输入;可以指定使用二进制或文本模式。如果在构造函数中指定一个文件名,在构造该对象时该文件便自动打开。否则,需要在调用默认构造函数之后使用open函数来打开文件。
很多格式化选项和成员函数都可以应用于ifstream对象,基类ios和istream的所有功能都包括在ifstream中。
1、构造输入流对象
如果仅使用cin对象,则不需要构造输入流对象,如果要使用文件流从文件中读取数据,就必须构造一个输入流对象。建立一个输入文件流的常用方式如下:
a)使用默认构造函数建立对象,然后调用open成员函数打开文件,例如:
ifstream myFile;//建立一个文件流对象
myFile.open("filename",iosmode);//打开文件filename
或者:
ifstream* pmyFile=new ifstream;//动态建立一个文件流对象,获取对象指针
pmyFile->open("filename",iosmode);//用对象指针调用open函数打开文件
2)在调用构造函数建立文件流对象使指定文件名和模式,在构造过程中打开该文件:
ifstream myFile("filename",iosmode);
2、使用提取运算符
提取运算符(>>)对于所有标准c++数据类型都是预先设计好的,他是从一个输入流对象获取字节最容易的方法。
提取运算符(>>)是用于格式化文本输入的,在提取数据时,以空白符为分隔。如果输入一端包含空白的文本,则需要使用非格式话输入成员函数getline。
3、输入流操纵符
定义在ios_base类中和<iomanip>头文件中的操纵符可以应用与输入流。但是只有少数几个操纵符对输入流有实际的影响,其中最重要的是进制操纵符dec、oct和hex。
在提取中,hex操纵符可以接收处理各种输入流格式。如:c、C、0xC、0XC都被解释为十进制12.任何除0-9、A-F、a-f和X之外的字符都引起数值变化终止。例如:序列124n5将变成数值124,并设置ios_base::fail位。
4、输入流成员函数
输入流成员函数用于从磁盘文件中输入,如下:
open函数
get函数
getline函数
read函数:read成员函数从一个文件读字节到一个指定的存储区域,由长度参数确定要读的字节数。如果给出长度参数,当遇到文件结束或在文本模式文件中遇到文件结束标记字符时读结束。
#include<iostream>
#include<fstream>
#include<cstring>
#include<string>
using namespace std;
int main()
{
struct
{
double salary;
char name[23];
}employee1,employee2;
employee1.salary = 8000;
strcpy_s(employee1.name,"L Zheng");
ofstream outfile("payroll",ios_base::binary);
outfile.write((char *)&employee1,sizeof( employee1));
outfile.close();
ifstream is("payroll",ios_base::binary);
if (is)
{
is.read((char *)&employee2,sizeof(employee2));
cout << employee2.name << ' ' << employee2.salary;
getchar();
cout<< endl;
}
else
{
cout << "ERROR:Cannot open file'payroll.'"<<endl;
}
is.close();
}
seekg函数和tellg函数
close函数
4、输入、输出流
一个iostream对象可以是数据的源或目的。两个重要的I/O流类都是从iostream类派生的,他们是fsteeam和stringstream。这些类继承了前面描述的istream和ostream类的功能。
fstream类支持磁盘文件输入和输出。如果需要在同一个程序中从一个特定磁盘文件读并写到该磁盘文件,可以构造一个fstream对象。一个fstream对象是有两个逻辑子流的单个流,两个子流一个用于输入,一个用于输出。