- getline函数
- 从一个给定的istream读取一行数据,存入一个给定的string对象中。
string str;
std::getline(cin, str);
1. IO类
- IO类型:定义在三个独立的头文件中(iostream、fstream、sstream)
头文件 类型
iostream istream 从流读取数据
ostream 向流写入数据
iostream 读写流
fstream ifstream 从文件读取数据
ofstream 向文件写入数据
fstream 读写文件
sstream istringstream 从string读取数据
ostringstream 向string写入数据
stringstream 读写string
//在类型或者函数前添加w代表宽字符版本
IO对象无拷贝和赋值
while(cin>>word)
//操作
- 由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为IO类型。
- 进行io操作的函数通常以引用方式传递和返回流,而读写io对象会改变其状态,因此传递和返回的引用不能是const的
条件状态
- 确定一个IO对象的状态最简单的方法是将它当作一个条件来使用:
while(cin>>word)
//操作
2. 文件输入输出
- ftream继承自iostream,其特有的操作如下:
fstream fstrm; //创建一个未绑定的文件流
fstream fstrm(s); //创建一个fstrem,并打开名为s的文件
fstream fstrm(s, mode); //与上一个函数类似,但按指定mode打开文件
fstrm.open(s) //打开名为s的文件,并将文件与fstrm绑定
fstrm.close() //关闭与fstrm绑定的文件
fstrm.is_open() //返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
- 使用文件流对象:
ifstream in(file); //构造一个ifstream并打开指定文件
ofstream out; //输出文件流未关联到任何文件
char* fname = "123.txt";
ifstream f(fname);
string str;
getline(f, str);
cout << str << endl;
- 对于一个接受ostream&参数的函数,可以传递给它一个ofstream对象,istream同理。
- 成员函数open和close
- 如果我们定义了一个空文件流对象,可以随后调用open将其和文件关联
- 调用open可能会失败,因此通常对其调用是否成功进行检测。
ofstream out;
out.open(fname+".copy");
if(out)
out << "Hello World!\n";
out.close();
- 一旦一个文件流打开,它就保持与对应文件的关联。为了将文件流关联到另一个文件,必须首先关闭已经关联的文件。
ifstream in(ifile1);
in.close();
in.open(ifile2);
- 当一个fstream对象离开其作用域时会被自动销毁,与之关联的文件会自动关闭。
文件模式
in //以读方式打开,ifstream默认使用此模式
out //以写方式打开,ofstream默认使用此模式,fstream默认使用in和out模式。,以out模式打
开的文件默认会被截断
app //每次写操作前均定位到文件末尾
ate //打开文件后立即定位到文件末尾
trunc //截断文件
binary //以二进制方式进行IO
- ofstream和fstream只能用out模式,istream和fstream只能用in模式。
- ate和binary可以用于任何类型的文件流对象,且可以与其他模式组合使用。
- 以out模式打开文件会丢弃已有数据,为了保存文件内容,显示指定app模式
ofstream out("file",ofstream::app); //定位到文件末尾,保存文件中的已有数据
ofstream app("file2", ofstream::app);
//或者
ofstream app("file2", ofstream::out | ofstream::app);
- 每次调用open时都会确定文件模式
ofstream out;
out.open("123"); //模式隐含设置为输出和截断
out.close();
out.open("abc", ofstream::app); //模式为输出和追加
3. string流
- 头文件:#include<sstream>
- istringstream:从string中读取数据;
ostringstream:向string中写数据
stringstream:读写数据
- istringstream:从string中读取数据;
- stringstream特有的操作:
sstream strm; //strm是一个未绑定的stringstream对象
sstream strm(s); //strm是一个sstream对象,保存string s的一个拷贝
strm.str() //返回strm所保存的string的拷贝
strm.str(s) //将string s拷贝到strm中,返回void
使用istringstream
//string流
struct PersonInfo
{
string name;
vector<string>phones;
};
string line, word;
vector<PersonInfo> people;
string inf = "person_info.txt";
ifstream in(inf);
while (getline(in, line)) //获取每一行
{
PersonInfo person;
istringstream record(line); //将记录绑定到读入的行
record >> person.name;
while (record >> word)
person.phones.push_back(word);
people.push_back(person);
}