记录研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的日渐逼近,以及昨天晚上和老师沟通,当把自己整个心神都沉浸在其中的时候,灵感真是刷刷刷地来呀!
就是希望在以后地学习生活中,遇到问题不要退缩,干就完了,老天总不能把你逼近绝境是吧(自我催眠地第一次,嘿嘿)