参考博文连接 最近做货位分配功能,用csv文件记录仓库货位的存储状态,0表示空,1表示占用,即不可用;系统每次先读取csv文件,记录货位信息状态,在得到最优货位分配方案之后,更新货位信息,即csv文件
具体改写操作流程可分为:
1)读取源文件并将字符串保存到vector1中;
2)根据最佳货位分配方案,标记需要改写的某行某列;如3行4列
3)将3行的字符串提取出来,将每列的内容加上逗号再存入另一个vector2,将第4列的数据由0变为1;
4)重复以上操作,全部更新完毕后,将vector1的内容再重新写入文件中
简单来说,整个过程可以看作是,将内容提取出来,放在一个容器中,改写容器中的内容,再将改后的内容写入原文件中,值得注意的由2点:一是要将写入的内容以逗号隔开,二是在改写过程中是将某行内容转化为vector,以边完成对指定列的改写
改写前的csv文件:
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void Correct(string& a, int col)
{
//cout << "替换前的a:" << a << endl;
int num_content = 4;
vector<string> tmp_store;
string final;//定义最后得到的字符串
string new_Content="1";//改写的内容
char b[100];
strcpy_s(b, a.c_str());
string temp;
char delima[] = ",";
char* result = NULL;
char* p=NULL;
result = strtok_s(b, ",",& p);//以逗号分隔
int cont = 0;
while (result != NULL)
{
cont++;
temp = result;
if (cont < num_content)
{
temp += ',';
}
tmp_store.push_back(temp);//将每列的内容加上逗号重新存入入vector
result = strtok_s(NULL, ",",&p);
}
tmp_store[col - 1] = new_Content + ',';//改写指定列的内容
for (int i = 0; i < tmp_store.size(); i++)
{
final += tmp_store[i];//将tmp_store的内容放入字符串中
}
a = final;
//cout << "替换后的a:" << a << endl;
return;
}
int main()
{
string str_1;
string str_2;
ifstream rFile_1("文件名.csv", ios::in);
vector<string>Content_1;//存放文件中的内容
if (rFile_1.fail())
{
cout << "读取文件失败" << endl;
}
while (getline(rFile_1, str_1))
{
Content_1.push_back(str_1);
}
rFile_1.close();
int ind =3;//根据算法求解得到的最终粒子解中的最佳个体索引,算法太长,这边就不展示了,只陈列结果
for (int i = 0; i < 4; i++)//此处的4指需要改写的个数,源码中是一个变量,此处我直接给出结果
{
int row = Parent.individualSet[ind].Gene[1][i];//最优解中货位对应csv文件中应修改的行数,根据解的内容分别需要改写3行1列的,4行1列的,1行3列,3行2列
int col= Parent.individualSet[ind].Gene[2][i];//最优解中货位对应csv文件中应修改的列数
//cout << "替换前的大小:"<<Content_1[row - 1].size() << endl;
//cout << "替换前的内容:" << Content_1[row - 1] << endl;
//改写的函数
Correct(Content_1[row - 1], col);
//cout << "替换后的大小:" << Content_1[row - 1].size() << endl;
//cout << "替换后的内容:" << Content_1[row - 1] << endl;
//cout << Content_1[row - 1];
}
//重新写入
ofstream File_1("文件名.csv");
for (int i = 0; i < Content_1.size(); i++)
{
File_1 << Content_1[i] << endl;
}
File_1.close();
}
改写后结果:
可以看到原文件中3行1列的,4行1列的,1行3列,3行2列的值已从0变为1