C++ Primer第八章!
#include "stdafx.h"
#include<string>
#include<vector>
#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
class PersonInfo
{
public:
string &get_name(){ return name; }
vector<string> &get_phone() { return phones; }
private:
string name;
vector<string> phones;
};
int main()
{
//IO对象不能拷贝或者赋值!因此只能将形参和返回类型设置为引用,且不能为const!标准库在定义IO类时,对拷贝赋值进行了删除声明!
//条件状态
//iostate
//badbit badbit用来指出流已崩溃
//failbit failbit用来指出一个IO操作失败
//eofbit eofbit用来指出流到达了文件结束
//goodbit goodbit用来指出流未处于错误状态
//s.eof() 若eofbit置位,则返回true
//s.fail() 若failbit或badbit置位,则返回true
//s.bad() 若badbit置位,则返回true
//s.good() 若s处于有效状态,则返回true
//s.clear(flags) 根据flags,将对应状态复位
//s.setstate(flags) 根据flags,将对应状态置位
//s.rdstate() 返回流s的当前条件状态,返回类型为iostate
//判断流的状态
//while(cin>>word),
//每个输出流都管理一个缓冲区,用来保存程序输出数据!
cout << "ok!" << endl; //输出ok和一个换行,然后刷新缓冲区
cout << "ok!" << flush; //输出ok,然后刷新缓冲区
cout << "ok!" << ends; //输出ok和一个空字符,然后刷新缓冲区
//可以使用cout<<unitbuf,告诉程序每次输出操作后都进行flush操作!在程序异常终止时,输出缓冲区不会被刷新,因此应该注意及时刷新缓冲区!
cout << endl;
//关联输入和输出流,标准库将cout和cin关联在一起,当发生输入数据时都会先刷新关联的输出流。
cin.tie(nullptr); //cin将不再与任何流关联
cin.tie(&cout); //cin与cout关联!
//文件输入输出
//fstream特有的操作,包含ofstream和ifstream
//fstream fstrm; 创建未绑定的文件流
//fstream fstrm(s) 创建文件流,并打开文件s,s可以为string或c风格字符串
//fstream fstrm(s,mode) 并以指定mode打开文件
//fstrm.open(s) 打开文件s,并与文件流绑定
//fstrm.close() 关闭与fstrm绑定的文件
//fstrm.is_open() 指出与fstrm关联的文件是否成功打开且尚未关闭!
ifstream in("C:\\Users\\winack\\Documents\\Visual Studio 2017\\Projects\\chapter-8\\文件流文本.txt");
if (in)
{
vector<string> in_print;
string in_print_tmp;
while (in>>in_print_tmp)
{
cout << in_print_tmp << endl;
in_print.push_back(in_print_tmp);
}
}
else
{
cerr << "couldn't open the file!" << endl;
}
in.close(); //当一个fstream对象被销毁时,close会自动被调用!
//文件模式
//in 以读方式打开,ifstream默认模式
//out 以写方式打开,ofstream默认模式,文件的内容会被丢弃(trunc)
//app 以追加方式打开,只有trunc没有设定才能设定app,在app模式文件以输出方式打开
//ate 打开文件后,立即定位到文件末尾
//trunc 截断文件
//binary 以二进制方式进行IO
ofstream out1("123.txt", ofstream::out);
ofstream out2("123.txt", ofstream::app);
//string流
//stringstream特有的操作,包含istringstream和ostringstream
//sstream strm; 创建stringstream,未绑定string
//sstream strm(s) 保存string s的拷贝,此构造函数为explicit,
//strm.str() 返回strm所保存的string的拷贝
//strm.str(s) 将string s拷贝到strm中,返回void。
//读取信息
vector<PersonInfo> people;
ifstream in_string("C:\\Users\\winack\\Documents\\Visual Studio 2017\\Projects\\chapter-8\\string流文本1.txt");
if (in_string)
{
string line_info;
while (getline(in_string, line_info))
{
PersonInfo per;
string word;
istringstream record(line_info);
record >> per.get_name();
while (record>>word)
{
per.get_phone().push_back(word);
}
people.push_back(per);
}
}
in_string.close();
//编辑信息
ofstream out_string("C:\\Users\\winack\\Documents\\Visual Studio 2017\\Projects\\chapter-8\\string流文本2.txt", ofstream::trunc);
if (out_string)
{
out_string << "\n" << "The New Information!" << endl;
for (auto &record_old : people)
{
ostringstream record_new;
record_new << record_old.get_name();
for (auto &num : record_old.get_phone())
{
if (num.length() != 6)
num = "######";
record_new << " " << num;
}
cout << record_new.str() << endl;
out_string << record_new.str() << endl;
}
}
out_string.close();
cin.ignore();
return 0;
}
//iostream,标准输入输出流,分为istream、wistream、ostream、wostream。。fstream和sstream都是继承iostream,几乎可以无差别应用方法!
//fstream,文件输入输出流,分为ifstream、wifstream、ofstream、wofstream。
//sstream,string输入输出流,分为istringstream、wistringstream、ostringstream、wostringstream、stringstream、wstringstream。
//宽字符以W开头,有什么意义吗?
网友评论