c++批量读取txt文件,并按规定格式输出到txt

记录研0第一个程序任务:批量读取txt文件,并按规定格式输出到一个txt文件种。

- 一、代码`

#include<stdio.h>
#include<stdlib.h>
#include
#include<string.h>
#include
#include
#include
using namespace std;

//测试,参考自贤哥写的java的if else
//测试if自动化,输出需要用到
int read1(int num1) //定义一个read1函数,用来读取单个txt文件
{

ofstream fout("E:\\data01\\multi-period vaccination problem__data\\result53.txt", ios::app);   //输出路径,输出接着之前行末

//这三行是之前用for循环做的,其实更快捷
//for (int num1 = 1; num1 < 136; num1++) {
//for (int num2 = 0; num2 < 9; num2++) {
//for (int num3 = 0; num3 < 9; num3++) {

char fname[200];  //定义文件名称
//打开文件
snprintf(fname, sizeof(fname), "E:\\data01\\multi-period vaccination problem__data\\Example_%d.txt", num1);

//这里要按格式输出if 或者elseif
if(num1 == 1){
fout << "if a == " << num1 << endl;;
}
else {
fout << "elseif a == " << num1<<endl;
}

//这里是之前尝试时候的错误,一个%d面要有一个整数,我复制别人复制太多了,结果折磨了一上午才改掉
//ifstream fin(“E:\Projects\multi-period vaccination problem__data\Example_%d_%d_%dt”, ios::in);
ifstream fin(fname);

//定义待会要用到的一些字符串
string filename;
string line;

string str;
string substr;

//这里定义的是特殊字符,当遇到他们的时候,这一行会有特定的输出方式
string a = “Omega”;
string b = “J”;
string c = “K”;
string d = “T”;
string e = “XY_j”;
string f = “XY_k”;
string g = “c_k”;
string h = “g_k”;
string i = “Q”;
string j = “p_nj”;
string k = “e_j”;
string l = “r_j”;
string m = “l_j”;
string n = “w_j”;
string o = “u_j”;
string p = “q_1j”;
string q = “q_2j”;

//用来判断上面定义的特殊字符是否存在的语句,这里我也不太懂,复制过来就能直接用,不需要做什么改变
string::size_type idx;

if (fin) // 开始读取文件,如果有该文件开始执行括号内容,没有的话跳到最后那个else,这里用的是笨办法,挨个判断的,是否可以用个循环呢?值得思索
{
	while (getline(fin, line)) // line中不包括每行的换行符,读去这一行的数据
	{
		idx = line.find(a);//复制过来的,咱也不知道具体功能是怎么发挥的
		if (idx != string::npos) {   //if后面那个括号就是进行判断的,如果这一行返回的不是空值,就执行括号内语句,否则跳到下一个else if
			// 当字符串中包含 "Omega=" 时输出或写入文件,下面类似
			// string.substring(26) 是截取字符串的第 26 位至结束,C 应该有类似的方法,这个是原先java的东西
			string  A = line.substr(26, 5);  //把这行要输出的东西放到A里面
			fout << "Omega=" + A + ";" << endl;//输出
		}
		else if (line.find(b) != string::npos) {
			string  B = line.substr(25, 256);
			fout << "J=" + B + ";" << endl;
			//fout << "J=" << (str.length() - 25, str.length()) << endl;
			//System.out.println("J=" + string.substring(25));
		}
		else if (line.find(c) != string::npos) {
			string  C = line.substr(24, 256);
			fout << "K=" + C + ";" << endl;
			//fout << "K=" << (str.length() - 24, str.length()) << endl;
			//System.out.println("K=" + string.substring(24));
		}
		else if (line.find(d) != string::npos) {
			string  D = line.substr(17, 256);
			fout << "T=" + D + ";" << endl;
			//fout << "T=" << (str.length() - 17, str.length()) << endl;
			//System.out.println("T=" + string.substring(17));
		}
		else if (line.find(e) != string::npos) {

			string  E = line.substr(16, 256);
			fout << "XY_j=[" + E << endl;
			//for (int i = 0; i < 10; i++) {
			//	fout << E;
			//};
			//fout << "]" << endl;
			// 这里没写完整,之后需要再改一下

			//fout << "XY_j=[" << (str.length() - 16, str.length()) <<" ]"<<endl;
			//System.out.println("XY_j=[");
		}
		else if (line.find(f) != string::npos) {

			fout << "];" << endl;
			string  F = line.substr(16, 256);
			fout << "XY_k=[" + F ;
			//fout << "XY_k=[" << (str.length() - 16, str.length()) << " ]" << endl;
			//System.out.println("XY_k=[");
		}
		else if (line.find(g) != string::npos) {
			fout << "];" << endl;

			string  G = line.substr(13, 256);
			fout << "c_k=[" + G + "];" << endl;
			//fout << "c_k=[" << (str.length() - 13, str.length()) << " ]" << endl;
			//System.out.println("c_k=[" + string.substring(13) + "]");
		}
		else if (line.find(h) != string::npos) {

			string  H = line.substr(19, 256);
			fout << "g_k=[" + H + "];" << endl;
			//fout << "g_k=[" << (str.length() - 19, str.length()) << " ]" << endl;
			//System.out.println("g_k=[" + string.substring(19) + "]");
		}
		else if (line.find(i) != string::npos) {

			string  Q = line.substr(18, 256);
			fout << "Q=" + Q + ";" << endl;
			//fout << "Q =" << (str.length() - 18, str.length()) << endl;
			//System.out.println("Q=" + string.substring(18));
		}
		else if (line.find(j) != string::npos) {
			string  J = line.substr(22, 256);
			fout << "p_nj=[" + J << endl;
			//fout << "p_nj=[" << (str.length() - 19, str.length()) << " ]" << endl;
			//System.out.println("p_nj=[");
		}
		else if (line.find(k) != string::npos) {
			fout << "];" << endl;
			string  K = line.substr(18, 256);
			fout << "e_j=[" + K + "];" << endl;
			//fout << "e_j=[" << (str.length() - 18, str.length()) << " ]" << endl;
			//System.out.println("e_j[=" + string.substring(18) + "]");
		}
		else if (line.find(l) != string::npos) {
			string L = line.substr(18, 256);
			fout << "r_j=[" + L + "];"<<endl ;
			//fout << "r_j=[" << (str.length() - 18, str.length()) << " ]" << endl;
			//System.out.println("r_j=[" + string.substring(18) + "]");
		}
		else if (line.find(m) != string::npos) {
			string  M = line.substr(30, 256);
			fout << "l_j=[" + M + "];" << endl;
			//fout << "l_j=[" << (str.length() - 30, str.length()) << " ]" << endl;
			//System.out.println("l_j=[" + string.substring(30) + "]");
		}
		else if (line.find(n) != string::npos) {
			string  N = line.substr(12, 256);
			fout << "w_j=[" + N + "];" << endl; ;
			//fout << "w_j=[" << (str.length() - 19, str.length()) << " ]" << endl;
			//System.out.println("w_j=[" + string.substring(12) + "]");
		}
		else if (line.find(o) != string::npos) {
			string O = line.substr(27, 256);
			fout << "u_j=[" + O + "];" << endl ;
			//fout << "u_j=[" << (str.length() - 12, str.length()) << " ]" << endl;
			//System.out.println("u_j=[" + string.substring(27) + "]");
		}
		else if (line.find(p) != string::npos) {
			string  P = line.substr(47, 256);
			fout << "q_1j=[" + P + "];" << endl;
			//fout << "q_1j=[" << (str.length() - 47, str.length()) << " ]" << endl;
			//System.out.println("q_1j=[" + string.substring(47) + "]");
		}
		else if (line.find(q) != string::npos) {
			string  Q = line.substr(25, 256);
			fout << "q_2j=[" + Q + "];" << endl; ;
		
			//fout << "q_2j=[" << (str.length() - 25, str.length()) << " ]" << endl;
			//System.out.println("q_2j=[" + string.substring(25) + "]");
		}
		else {
			// 当这行全是数据时直接输出
		//上述那句话是错的,贤哥当时候没有考虑空行的存在,或许他用的那个resultprint不需要考虑吧
		//当我们监测到那些特殊字符都不存在时,有两种情况,一种是空行,另一种才是都为数据,两种处理方式不同
		//因为我们的输出要求行与行之间不能有空格,并且在一个变量的数据在输出开始前和输出开始后要加  [ 或者  ],所以这里我也是做错好多次才实现最终版本
		//当这一行为空行时(通过判定这行的长度,下述的line.length()),我们跳过这次读取,进行下一行
		//当这一行不为空行时,有两种情况:一是下一行还是数据行,直接输出上一行东西就好了,二是下一行开始了新的变量,这里我们就要再输出上一行的基础上加一个  ]  了
			


			if(line.length()==0){
				continue;
			}
			else {
				string store = line.substr(0, 256);
				 //getline(fin, line);
				if(line.find(a) != string::npos       //这里判断下一行是否为新的变量行
					|| line.find(b) != string::npos
					|| line.find(c) != string::npos
					|| line.find(d) != string::npos
					|| line.find(e) != string::npos
					|| line.find(f) != string::npos
					|| line.find(g) != string::npos
					|| line.find(h) != string::npos
					|| line.find(i) != string::npos
					|| line.find(j) != string::npos
					|| line.find(k) != string::npos
					|| line.find(l) != string::npos
					|| line.find(m) != string::npos
					|| line.find(n) != string::npos
					|| line.find(o) != string::npos
					|| line.find(p) != string::npos
					|| line.find(q) != string::npos
					) {
					fout << store;
				}
			else {

				fout << store << endl;
			}
			}
				
		

			//System.out.println(string);
		}
		

	}
}
//}



return 0;

}

//主函数,用来遍历文件夹
int main() {

ofstream fout("E:\\data01\\multi-period vaccination problem__data\\result53.txt", ios::app);

char fname[200];
int num1 = 1;
int i = 0;
//cout << "请输入从哪个文件开始汇总:" << endl;
//cin >> i;


while (i < 135) {
	snprintf(fname, sizeof(fname), "E:\\data01\\multi-period vaccination problem__data\\Example_%d.txt", num1);

	if (num1 == i) {
	
		read1(i);

	}
	else {
		read1(num1++);
		
	}
	i++;
}

system("pause");

return 0;

}

二、感想

第一个任务算是勉勉强强结束了,代码里的东西依旧还有许多不懂得地方,或者是有些冗余啊什么的。
希望自己可以在c++的学习上更上一层楼,最起码也要完成以后科研的需要。
还有一点,在完成代码的这段时间里,深深感觉到 畏难 带来的无力感,从开始的推脱,到后来ddl的日渐逼近,以及昨天晚上和老师沟通,当把自己整个心神都沉浸在其中的时候,灵感真是刷刷刷地来呀!
就是希望在以后地学习生活中,遇到问题不要退缩,干就完了,老天总不能把你逼近绝境是吧(自我催眠地第一次,嘿嘿)

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值