【C++Primer---C++知识点记录*V---IO库】

目录

IO类

IO对象无拷贝或赋值

条件状态

管理输出缓冲

文件输入输出

string流


IO类

iostream定义了用于读写流的基本类型

fstream定义了读写命名文件的类型

sstream定义了读写内存string对象的类型

标准库使我们能忽略不同类型的流之间的差异,这是通过继承机制实现的(例如ifstream继承自istream)

IO对象无拷贝或赋值

因为不能拷贝,所以不能将形参和返回值类型设置为流类型,所以进行IO操作的函数要以引用的方式传递和返回流。

条件状态

有一些函数和标志,可以帮助我们访问和操纵流的条件状态

p280

管理输出缓冲

每个输出流都管理一个缓冲区,用来保存程序读写的数据

有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。

unitbuf操纵符--告诉流在接下来的每次操作中都进行一次flush操作(刷新缓冲区)

注意:如果程序崩溃,输出缓冲区不会被刷新。因此有时程序其实已经执行完了,只不过结果因为缓冲区没有刷新没法显示!

当一个输入流被关联到输出流时,从输入流读数据,就会先刷新关联的输出流。标准库将cout和cin关联在一起

怎么关联?——tie

版本1:不带参数,返回指向输出流的指针(空指针/该对象关联的输出流的指针)

版本2:接受一个指向ostream的指针,关联到该ostream

 

文件输入输出

头文件fstream定义了三种类型——ifstream  ofstream  fstream

文件类型分为文本文件和二进制文件

写文件

 

而文件打开方式有:

 文件打开方式是可以配合使用的,在中间用 | 操作符就ok

读文件

 

int main() {
	ifstream ifs;
	ifs.open("z.txt", ios::in);
	if (!ifs.is_open()) {
		cout << "打开失败!" << endl;
		return 0;
	}
	//读数据
	//1.
	char buf[1024] = { 0 };
	while (ifs >> buf) {
		cout << buf << endl;
	}

	//2.
	char buf[1024] = { 0 };
	while (ifs.getline(buf,sizeof(buf))){
		cout << buf<<endl;
	}
	//3.
	string buf;
	while (getline(ifs, buf)) {
		cout << buf << endl;  //都是一行行读
	}

	//4.
	char c;
	while ((c=ifs.get())!=EOF) {
		cout << c;
	}
	ifs.close();
}

读写文件-二进制

用到了ofs和ifs类中的write和read函数,同时要记得在open时加上打开方式ios::binary

class Person {
public:
	char name[64];
	int age;
};

int main() {
	ofstream ofs;
	ofs.open("Person.txt", ios::out | ios::binary);
	Person p = { "喵喵",8 };
	ofs.write((const char*)&p, sizeof(Person));
	ofs.close();

	ifstream ifs;
	Person buf;
	ifs.open("Person.txt", ios::in | ios::binary);
	ifs.read((char*)&buf, sizeof(Person));
	cout << buf.name << " " << buf.age;
	ifs.close();
}

string流

当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream


struct personInfo {
	string name;
	vector<string>phone;
};

int main() {
	string line, word; //line中存放每一条记录,word是姓名后边的一串电话
	vector<personInfo> people; //保存来自所有输入的记录
	while (getline(cin, line)) {
		personInfo info;
		istringstream record(line); //把record绑定到line
		record >> info.name; //读取名字
		while (record >> word) //读取名字后面的一个个单词
			info.phone.push_back(word);
		people.push_back(info);
	}
}

当我们逐步构造输出,希望最后一起打印时,用ostringstream

(p289)

先把输出内容“写入”到一个ostringstream对象中

os<<xxxx

之后输出:cout<<os.str() //返回一个字符串

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值