自动批量将C++程序生成的同名数据文件(.txt)保存至不同文件夹

自动批量将C++程序生成的同名数据文件(.txt)保存至不同文件夹,第1张

目录

1 场景描述

2 解决流程

2.1 批量建立文件夹并重命名

2.2 保存文件夹路径至字符串数组

 2.3 动态更改输出路径

3 总结


 1 场景描述

        在我们用C++进行计算时,经常会利用如ifstream类、ofstream类以及fstream类等文件流类对数据文件 *** 作,例如将计算的结果保存到“datafile.txt”本地文件中。

ofstream out_file("./datafile.txt",ios::out);

        但我们往往会将程序进行循环运行并将计算的结果保存到本地的文件中。在一次计算之后,文件路径中会生成datafile.txt文件。如果在下次循环计算开始之前,我们没有将“datafile.txt”文件另存为或者重命名,那么下次计算结束后,新的数据会覆盖上一次的数据保存到“datafile.txt”中,这是因为“ios::out”的作用就是“以输出方式打开文件,如果已有此名字的文件,则将其原有的内容全部清除。”

        解决方法:

(1) 每次结束后,都将数据文件另存为或重命名;

(2) 在程序中写上多条语句,每条语句中的路径都不一样;

        很显然上述两种方法,非常的低效且费时、或者说使得代码很冗杂。下面给出一种思路,可以将每次计算生成的同名文件“datafiletxt”保存到不同的路径(放到不同的文件夹中)。


2 解决流程 2.1 批量建立文件夹并重命名

        Step1:

        在要保存文件的文件夹中,我们先准备好多个以用于存放每一次计算得到的文件的文件夹;我们打开Excel,借助Excel的填充功能生成一列文件夹名称“datafile+数字”。记得要把前面一定要带有md还有一个空格。如下图所示。

 可以多准备一些文件夹,因为有时候程序要循环计算的次数未知,尽量保证一定的冗余性。例如我准备了一百个文件夹名称。

        Step2:

        将Excel中填充得到的文件夹名字复制到txt文档中,然后保存关闭;重命名该txt文档,将其后缀名改为.bat。它可能会提示这样的 *** 作可能会使文件损坏或不可用,点是即可。然后双击运行“datafile.bat”文件,便会自动生成100个,如下图所示:

2.2 保存文件夹路径至字符串数组

        Step1:

        同样的,我们借助Excel对路径进行填充,路径的名称和数量应该跟文件一一对应;如下图所示;然后将多条路径名称复制到txt文档中。

         Step2:

        可参考下方代码段,创建一个字符串数组,每个元素的值对应一个文件夹路径。

/读取预先准备好的文件夹路径至字符串数组中/
	int p;
	string line;
	int len_filepath = 100;		                        //初步选择100个文件夹
	string* ArrFilePath = new string[len_filepath];     //定义动态数组
    //"./SaCoverData/filename.txt",存放的是100条文件夹路径
	ifstream in_file("./SaCoverData/filename.txt", ios::in);
	if (in_file)    //如果流对象和文件是建立关联的(文件是“打开”的)
	{
		for (p = 0; p < len_filepath; p++)
		{
			getline(in_file, line);				//从输入流中读取字符串到line中
			ArrFilePath[p] = line;				//将line中的值赋给ArrFileName数组的元素
			cout << ArrFilePath[p] << endl;		//输出读入的文件名路径字符串,检查是否读入正确
		}
	
	}
	in_file.close();
 2.3 动态更改输出路径

        这里涉及到字符串拼接,就是将两个String类型的变量或者字符串拼接成一个字符串。

我们可以建立如下函数:

void SaveData(const string path) //path是前面提到的存放文件夹路径的字符串数组的元素
{
    ofstream out_file((path+"datafile.txt").c_str(),ios::out);
    //path的值是个字符串"./SaCoverData/datafile0","datafile.txt"也是个字符串;
    //(string + string).c_str()就是"./SaCoverData/datafile0/datafile.txt"
    //注意:在两个字符串之间不要漏了/,写在前者身上或者后者身上都行,但是拼接起来应该是个完整的路径
    out_file.close();
}

        如何调用上述函数:

        在主函数体中,循环计算过程中将2.2节提到的字符串数组 ArrFilePath[] 的元素依次作为SavaData()函数的输入即可;

SaveData(ArrFilePath[p]); 
//p的初始值为0,然后每次循环会加1,确保每次循环依次输入数组中的字符串元素在函数中进行拼接。

3 总结

         到这,可能会有人有这样一个问题,我直接将整个路径和数据文件都放到字符串数组中,这样就不用进行进行字符串拼接了。这当然是可以的,不过将路径和文件名称分开,有利于后续对数据文件名称进行修改,还有就是,如果一次计算生成一系列数据文件,他们放到同一个文件夹中,如果不进行字符串拼接的话,需要为每一个数据文件路径准备一个数组,比较麻烦。

        在循环计算N次之后,在datafile0——datafileN文件夹中,都存在一个datafile.txt文件对应着不同计算过程得到结果。

PS:在你的计算循环体中,记得声明一个计数变量,来统计有多少个文件生成。因为,你一开始建立的文件夹是足额的,所以这个计数变量可以帮助你快速知道前多少个文件夹内是有数据文件的。

分享到此,谢谢!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002070.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存