IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> IO流(C语言,C++) -> 正文阅读

[C++知识库]IO流(C语言,C++)

IO流

linux下叫终端,VS下叫控制台
一张继承图,cin是istream的对象,cout是ostream的对象
在这里插入图片描述
cin>> ->cin.operator>>()
cin比scanf慢的原因是底层封装太多,做的太笼杂了,跟编译没有关系
cin是如何做到连续的输入多个数?多个函数调用,返回值有关
真正的优势是,cin,cout可以重载自己想要的类型

1 .operator bool()

OJ多种输入,while(cin>>str){}
C语言while(scanf(“%s”,a)!=EOF){}
类型运算符重载 重载了operator bool()
这个函数不需要返回值,意思就是这玩意可以转成bool

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>

using namespace std;

class B
{
public:
	//不用带任何参数
	operator bool()
	{
		return _a;
	}
	int _a;
};

int main()
{
	//int i = 1;
	//double d = 2.2;
	//cout << i << endl;//cout.operator<<(i);
	//cout << d << endl;//cout.operator<<(d);
	//cout << i << endl << d << endl;
	printf可以输出多个输出
	//printf("%d %lf", i, d);

	//cin >> i;
	//cin >> d;
	//cout << i << d;
	B b;
	while(b)
	{
		cin>>b._a;
	}

	return 0;
}

2.C语言 将结构的数据写到文件当中去

二进制读写 fwrite,fread
文本读写 fputs/fscanf/fprintf 字符串的话可以直接写,如果是其他,先要把它转成字符串再写出去,回来再读进来
printf和fprintf的区别是什么?fprintf是写到某一个文件中去
点输出旁边的test.cpp右击可以跳到文件所在的目录
fscanf为什么读不出来?因为它是以空格或者换行为区分的

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<assert.h>

using namespace std;

struct ServerInfo
{
	char _ip[32];//ip
	int _port;	//端口
};

void C_write_test()
{
	ServerInfo info = { "127.0.0.1",80 };
	//fopen/fclose
	//二进制读写 fwrite/fread 
	//文本读写 fprintf/fscanf
	FILE* fout = fopen("test.h", "w");
	assert(fout);
	//fwrite(&info, sizeof(info), 1, fout);
	fprintf(fout, "%s %d", info._ip, info._port);
	fclose(fout);
	printf("%s %d", info._ip, info._port);
}

void C_read_test()
{
	//fopen/fclose
	//二进制读写 fwrite/fread 
	//文本读写 fprintf/fscanf
	FILE* fin = fopen("test.txt", "r");
	assert(fin);
	ServerInfo info ;
	//fread(&info, sizeof(info), 1, fin);
	fscanf(fin,"%s%d", info._ip, &info._port);
	fclose(fin);
	printf("%s:%d", info._ip, info._port);
}



int main()
{
	C_write_test();
	C_read_test();
	return 0;
}

3 . C++的写入和写出

定义一个Configmanager类
包string 和 fstream(文件流) 两个头文件
ofstream是写
w,a,r 是文本文件,如果想要二进制文件,后面要加一个b
实现二进制读写和普通读写
读一个Date类
重载流插入

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<sstream>

using namespace std;

class Date
{
public:
	friend istream& operator>>(istream& in, Date& d);
	friend ostream& operator<<(ostream& out, const Date& d);
	Date(int year, int month, int date)
		:_year(year)
		,_month(month)
		,_date(date)
	{

	}
private:
	int _year;
	int _month;
	int _date;
};
istream& operator>>(istream& in, Date& d)
{
	in >> d._year >> d._month >> d._date;
	return in;
}

ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << " " << d._month << " " << d._date;
	return out;
}

struct ServerInfo
{
	char _ip[32];
	int _port;

	Date _date;
};



class ConfigManager
{
public:
	ConfigManager(const char* filename)
		:_filename(filename)
	{}

	void WriteBin(const ServerInfo& info)
	{
		ofstream ofs(_filename, ios_base::out|ios_base::binary);
		ofs.write((const char*)&info, sizeof(info));
	}

	void ReadBin(ServerInfo& info)
	{
		ifstream ifs(_filename, ios_base::in | ios::binary);
		ifs.read((char*)&info,sizeof(info));
	}

	void WriteText(const ServerInfo& info)
	{
		ofstream ofs(_filename);
		ofs << info._ip << " " << info._port<<" "<<info._date;
	}

	void ReadText(ServerInfo& info)
	{
		ifstream ifs(_filename);
		ifs >> info._ip>> info._port>>info._date;
	}
private:
	string _filename;
};

int main()
{
	ServerInfo winfo = { "192.0.0.1", 80 ,{2022,5,3} };
	/*ConfigManager cf_bin("test.bin");
	cf_bin.WriteBin(winfo);

	ServerInfo accept;
	cf_bin.ReadBin(accept);
	cout << accept._ip << " " << accept._port << endl;*/

	ConfigManager cf_txt("test.txt");
	cf_txt.WriteBin(winfo);

	ServerInfo rtinfo = { "",0 ,{0,0,0} };
	cf_txt.ReadText(rtinfo);
	cout << rtinfo._ip << " " << rtinfo._port << endl;


	return 0;
}

4 .字符串流stringstream

调中间的str函数可以把里面的string取出来
应用:聊天时候的通讯,发出去的时候是不是都是字符串
ostringstream发,istringstream解析收 -> 专业名词:序列化和反序列化

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<sstream>
#include<fstream>
#include<string>
using namespace std;

class date
{
public:
	friend istream& operator>>(istream& in, date& d);
	friend ostream& operator<<(ostream& out, const date& d);
	date(int year, int month, int date)
		:_year(year)
		, _month(month)
		, _date(date)
	{

	}
private:
	int _year;
	int _month;
	int _date;
};
istream& operator>>(istream& in, date& d)
{
	in >> d._year >> d._month >> d._date;
	return in;
}

ostream& operator<<(ostream& out, const date& d)
{
	out << d._year << " " << d._month << " " << d._date;
	return out;
}


struct Info
{
	string _name;
	int _id;
	date _date;
	string _msg;
};

int main()
{
	Info winfo = { "person",1001,{2002,5,3},"晚上一起看电影把" };
	ostringstream oss;
	oss << winfo._name << winfo._id << winfo._date << winfo._msg;
	string str = oss.str();
	cout << str << endl;

	Info rInfo = { "",0,{0,0,0},"" };
	istringstream iss(str);
	iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;
	cout << "姓名:" << rInfo._name << " (" << rInfo._id << ") ";
	cout << rInfo._date << endl;
	cout << rInfo._name << ":>" << rInfo._msg << endl;
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:01:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 23:07:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码