关于保存数据到本地文件和从本地读取数据,这里提供两种简单方法。一种是直接保存到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文件用记事本打开的内容