C++的IO流

目录

C语言的输入与输出

流是什么

C++标准IO流

C语言文件的读写

        二进制的形式读写

        文本形式读写

C++文件IO流

stringstream


C语言的输入与输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()
scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中
printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)

流是什么

        “流”即是流动的意思,C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。
它的特性是:有序连续、具有方向性,为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。

C++标准IO流

int main()
{
	int i = 1;
    double d = 2.22;
	
	cout << i; // -> cout.operator<<(i);
	cout << d; // -> cout.operator<<(d);
	cout << i << d; // 两个operator<<函数调用
	printf("%d, %f\n", i, d);

	//cin >> i;
	//cin >> d;
	cin >> i >> d;
	scanf("%d%f", &i, &d);
	cout << i << d << endl;
	printf("%d, %f\n", i, d);

	//scanf / printf 的缺点是只能支持内置类型
	// cout<< / cin>> 真正优势是,自己重载以后,自定义类型对象可以是简单实用
	//Date d;
	//cin >> d;
	//cout << d;

	return 0;
}

C语言文件的读写

首先定义一个结构体(类)

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

	//Date _d;       //自定义类型
};

二进制的形式读写

void TestC_W_Bin()
{
	ServerInfo info = { "127.0.0.1", 80 };
	//二进制读写   fwrite/fread
	//文本读写     fprintf/fscanf
	FILE* fout = fopen("test.bin", "wb");
	assert(fout);

	fwrite(&info, sizeof(info), 1, fout);
	fclose(fout);
}

void TestC_R_Bin()
{
	FILE* fin = fopen("test.bin", "rb");
	assert(fin);

	ServerInfo info;
	fread(&info, sizeof(info), 1, fin);
	fclose(fin);

	printf("%s:%d\n", info._ip, info._port);
}

文本形式读写

void TestC_W_Text()
{
	FILE* fout = fopen("test.txt", "w");
	assert(fout);

	ServerInfo info = { "127.0.0.1", 80 };
	fprintf(fout, "%s %d", info._ip, info._port);
	fclose(fout);
}

void TestC_R_Text()
{
	FILE* fin = fopen("test.txt", "r");
	assert(fin);

	ServerInfo info;
	fscanf(fin, "%s%d", info._ip, &info._port);
	fclose(fin);

	printf("%s:%d\n", info._ip, info._port);
}

C++文件IO流

1. 定义一个文件流对象
ifstream ififile(只输入用)
ofstream ofifile(只输出用)
fstream iofifile(既输入又输出用)
2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
4. 关闭文件
class ConfigManager
{
public:
	ConfigManager(const char* filename)
		:_filename(filename)
	{}

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

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

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

	void ReadText(ServerInfo& info)
	{
		ifstream ifs(_filename.c_str());
		ifs >> info._ip >> info._port;
	}

private:
	string _filename;
};

int main()
{
	/*TestC_W_Bin();
	TestC_R_Bin();*/

	/*TestC_W_Text();
	TestC_R_Text();*/

	/*ServerInfo info = { "127.0.0.1", 80 };

	ConfigManager cm("config.bin");
	cm.WriteBin(info);
	cm.ReadBin(info);
	cout << info._ip << ":" << info._port << endl;*/

	ServerInfo winfo = { "127.0.0.1", 80 };

	ConfigManager cm("config.txt");
	cm.WriteText(winfo);

	ServerInfo rinfo;
	cm.ReadText(rinfo);

	cout << rinfo._ip << rinfo._port << endl;

	return 0;
}

stringstream

struct PersonInfo
{
	string _name;
	int _age;
	//...

	Date _d;
};

int main()
{
	//序列化
	PersonInfo info = { "张三", 18 };
	ostringstream oss;
	oss << info._name << " " << info._age << " ";
	oss << info._d;
	string str = oss.str();

	//反序列化
	istringstream iss(str);
	string name;
	int age;
	iss >> name >> age;

	return 0;
}

你可能感兴趣的:(c++,c++,开发语言,c语言)