文件管理操作之c++版本 cpp和流操作

首先来看一下c语言的操作

//c语言的写入
void main()
{
	int ar[] = { 10, 11, 22, 33, 44, 55, 66, 77, 88, 99 };

	int size = sizeof(ar) / sizeof(ar[0]);

	FILE* fp = fopen("Test1.txt", "w");
	assert(fp!=NULL);
	// "w" 是写入,创建一个fp的txt 功能是写入
	for (int i = 0; i < size; ++i)
	{
		fprintf(fp, "%d ", ar[i]);
		//fprintf 在fp中以整形输入ar[i]
	}
	fclose(fp);
}

void main()
{
	string str;
	while (getline(cin, str))
	{
		cout << str<< endl;
	}
}

//c语言的读
void main()
{
	int ar[10];
	FILE *fp = fopen("Test1.txt", "r");
	assert(fp != NULL);
	for (int i = 0; i<10; ++i)
		fscanf(fp, "%d", &ar[i]);
	fclose(fp);
}

c++中与c不同的是基于对象,用函数操作。下面是c++版本
通过文本文件读写 都是字符
cpp的输入流写法

void main()
{
	int ar[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99 };
	int n = sizeof(ar) / sizeof(ar[0]);

	ofstream ofile;

	ofile.open("Test2.txt", ios::out);
	assert(ofile);

	for (int i = 0; i < n; ++i)
		ofile << ar[i] << " ";
	ofile << endl;
	ofile << "end";
	ofile.close();

}
void main()
{
	int ar[10];
	ifstream ifile;
	ifile.open("Test2.txt", ios::in);
	assert(ifile);

	for (int i = 0; i < 10; ++i)
		ifile >> ar[i];
	ifile.close();
}

接下来看看c语言和c++的二进制读写的操作
因为代码段太多了 我就全部写一个编码段了,没有分开
每部是怎样操作干什么已经在代码段里写清楚啦!

//c++的读写
void main()
{
	int ar[10];
	int size = sizeof(ar) / sizeof(ar[0]);
	ifstream  ifile;
	ifile.open("Test22.txt", ios::in | ios::binary);
	//二进制写入 因为二进制没有转化 所以是乱码
	assert(ifile);
	ifile.read((char*)ar, sizeof(int)*size);
	ifile.close();
}

//c++的写文件
void main()
{
	int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int size = sizeof(ar) / sizeof(ar[0]);
	ofstream  ofile;
	ofile.open("Test22.txt", ios::out | ios::binary);
	//二进制写入 因为二进制没有转化 所以是乱码
	assert(ofile);
	ofile.write((const char*)ar, sizeof(int)*size);
	
	ofile.close();
}

//c语言的二进制读取
void main()
{
	int ar[10];
	int size = sizeof(ar) / sizeof(ar[0]);
	FILE* fp = fopen("Test11.txt", "rb");
	//二进制读出 
	assert(fp != NULL);
	fread(ar,sizeof(int),10,fp);
	fclose(fp);
}

void main()
{
	int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int size = sizeof(ar) / sizeof(ar[0]);
	FILE* fp = fopen("Test11.txt", "wb");
	//二进制写入 因为二进制没有转化 所以是乱码
	assert(fp != NULL);
	fwrite(ar, size, sizeof(int), fp);
	fclose(fp);
}

配置管理器 就是写一个文本 然后通过类来才做读写,代码如下,用ip和端口做例子。

//配置管理类的作用是将ip和端口的内容,从电脑中读取出来放在一个结构体里面
struct ServerInfo
{
	char _ip[32];
	int _port;
};
class ConfigManager
{
public:
	ConfigManager(string cfg = "ghcserver.txt")
		:_configfile(cfg)
	{}
public:
	void ReadInfo(ServerInfo &info)//把结构体放进去用来存数据
	{
		ifstream ifile(_configfile.c_str(), ios::in);//.c_str() string对象转化为指针类型
		assert(ifile);
		ifile >> info._ip >> info._port;
		ifile.close();
	}
	void WriteInfo(ServerInfo &info)
	{
		ofstream ofile(_configfile.c_str(), ios::out);
		assert(ofile);
		ofile << info._ip << " " << info._port;
		ofile.close();
	}
private:
	string _configfile;
};

将整型数字改成字符串有两种做法,一种是利用函数,一种是以流作为中间商,转化。代码如下:

//做法2
void main()
{
	int a = 783952;
	string str;
	stringstream ss; //好处是 不用考虑空间 
	//先将a输出给字符串流ss
	ss << a;
	//再将处理好的ss 输入给str;
	ss >> str;
	cout << str << endl;
	//ss底层就有一个str对象
	cout << ss.str() << endl;
	//ss使用后 必须清除一下  否则原来的数据依旧存在  
	//因为以 0/ 结尾的 所以下一个进来 也看不到
	ss.clear();

	int b = 8384;
	ss << b;
	ss >> str;
	cout << str << endl;
}
//做法1
//整形转化字符串的情况
void main()
{
	int a = 986725;
	char str[30] = { 0 };
	//将a中的每一个末尾 处理成一个字符存入str中
	//参数是 数字 存入的位置 以几进制处理
	//itoa(a, str, 10);  

	sprintf(str, "%d", a);
	//给str中以%d的形式放a
	cout << str << endl;
}

结束啦,谢谢

上一篇:三分钟了解区块链AR游戏Triffic2.0版本


下一篇:TeamViewer与曼联强强联合,跨界赋能,连接世界