C++ 数据(数组)在本地的简单保存与读取

关于保存数据到本地文件和从本地读取数据,这里提供两种简单方法。一种是直接保存到txt文档,

一、ifstream/ofstream/fstream类实现

这里提供一个在C++下 对一个数组的保存和加载参考程序:

#include<iostream>
#include <fstream>

#define DATA_LENGTH 10
#define MAPING_GRAPH_PATH "D:\\maping_graph.data" //这里后缀除了“.data”可以任意命名(如:".txt"等)

int g_maping_graph[DATA_LENGTH] ;//全局变量


/*@brief get g_maping_graph
*/
void get_maping_graph(char *path, int length)
{
	//std::ifstream fp(path);//只读文件 ,也可由下一句替代
	std::fstream fp(path, std::ios::in);//只读文件
	int temp;
	if (!fp.is_open())
	{
		printf("could not load file: %s\n", path);
		return;
	}

	for (int i = 0; i < length; i++)
	{
		fp >> temp;
		g_maping_graph[i]= temp;
	}
	printf("get maping_graph done .\n ");
	fp.close();
}

/*@brief save g_maping_graph
*/
void save_maping_graph(char *path, int length)
{
	std::ofstream fp(path, std::ios::trunc);//只写文件 + trunc若文件存在则删除后重建
	//std::fstream fp(path, std::ios::out | std::ios::trunc);//只写文件 + trunc若文件存在则删除后新建

	if (!fp.is_open())
	{
		printf("can't open file\n");
		return;
	}
	for (int i = 0; i < length; i++)
	{
		fp << g_maping_graph[i];
		fp << " ";
	}
	fp.close();
}


int main()
{

/**给全局变量g_maping_graph 赋值
*/
    printf("全局变量g_maping_graph 创建 \n");
	for (int i = 0; i < DATA_LENGTH; i++)
	{
		g_maping_graph[i] = i * 10;
		printf("g_maping_graph[%d]=%d\n", i, g_maping_graph[i]);
	}

/**全局变量g_maping_graph 存储
*/
	save_maping_graph(MAPING_GRAPH_PATH, DATA_LENGTH);

/**全局变量g_maping_graph 全部置0
*/
    memset(g_maping_graph,0,sizeof(int)*DATA_LENGTH);
    printf("全局变量g_maping_graph 全部置0 \n");
    for (int i = 0; i < DATA_LENGTH; i++)
    {
	    printf("g_maping_graph[%d]=%d\n", i, g_maping_graph[i]);
    }

/**全局变量g_maping_graph 读取
*/
	get_maping_graph(MAPING_GRAPH_PATH, DATA_LENGTH);
/**全局变量g_maping_graph 读取
*/
	printf("重新加载后的情况 \n");
	for (int i = 0; i < DATA_LENGTH; i++)
	    {
	    	printf("g_maping_graph[%d]=%d\n", i, g_maping_graph[i]);
	    }

	getchar();
	//system("PAUSE");
    return 0;
}

执行了上面的程序,会在所指路径MAPING_GRAPH_PATH("D:\\maping_graph.data")生成文件,下图分别为程序执行结果和maping_graph.data文件用记事本打开的内容:

  

 图1-1 程序执行结果   

 

 

     

图1-2 maping_graph.data文件用记事本打开的内容

 

二、fwrite/fread_s 函数实现

fwrite/fread_s函数都是以二进制形式对文件进行操作具有一定的保密性,且操作不限于文本文件,推荐本方式,参考程序如下:

#include<iostream>
#define DATA_LENGTH  10
#define MAPING_GRAPH_PATH2 "D:\\maping_graph.dat"
int g_maping_graph[DATA_LENGTH];//映射图全局变量

//@brief     保存数据g_maping_graph[...]
//@param[in] 所保存的数据路径
//@param[in] data_length 保存的数据长度
int save_data(const char* pfile_name, int data_length)
{
	FILE* fp;
	if (NULL == pfile_name)
	{
		printf("pfile_name is NULL.\n");
		return -1;
	}

	fp = fopen(pfile_name, "wb");
	if (NULL == fp)
	{
		printf("pfile_name is open failed.\n");
		return -2;
	}
	for (int i = 0; i < data_length; i++)
	{
		fwrite(&g_maping_graph[i], sizeof(int), 1, fp);//将g_maping_graph[i]写入文件
	}

	fclose(fp);

	return 0;
}

//@brief     加载数据g_maping_graph[...]
//@param[in] pfile_name  待加载的数据路径
//@param[in] data_length 加载的数据长度(要小于总长度)
int load_data(const char* pfile_name, int data_length)
{
	FILE* fp;

	if (NULL == pfile_name)
	{
		printf("pfile_name is NULL.\n");
		return -1;
	}

	fp = fopen(pfile_name, "rb");
	if (NULL == fp)
	{
		printf("pfile_name is open failed.\n");
		return -2;
	}

	for (int i = 0; i < data_length; i++)
	{
		fread_s(&g_maping_graph[i], sizeof(int), 1, sizeof(int), fp);//从文件中接着读取1个数给g_maping_graph[i]
	}
	fclose(fp);

	return 0;
}

int main()
{
	/**给全局变量g_maping_graph 赋值
	*/
	printf("全局变量g_maping_graph 创建 \n");
	for (int i = 0; i < DATA_LENGTH; i++)
	{
		g_maping_graph[i] = i * 10;
		printf("g_maping_graph[%d]=%d\n", i, g_maping_graph[i]);
	}

	save_data(MAPING_GRAPH_PATH2, DATA_LENGTH);//保存数据
	memset(g_maping_graph, 0, sizeof(int)*DATA_LENGTH);//g_maping_graph清零
	load_data(MAPING_GRAPH_PATH2, DATA_LENGTH);//加载数据


	printf("重新加载后的情况 \n");
	for (int i = 0; i < DATA_LENGTH; i++)
	{
		printf("g_maping_graph[%d]=%d\n", i, g_maping_graph[i]);
	}

	//getchar();
	system("PAUSE");
	return 0;
}

执行了上面的程序,会在所指路径MAPING_GRAPH_PATH("D:\\maping_graph.dat")生成文件,下图分别为程序执行结果和maping_graph.dat文件用记事本打开的内容:

 图2-1 程序执行结果  

 

 

  

图2-2 maping_graph.dat文件用记事本打开的内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值