文本通过循环扫描分组内容进行排除线

Text parsed line by line with loop scanning grouped content

本文关键字:排除 循环 扫描 文本      更新时间:2023-10-16

在txt文件中,种群0和1每个都有其自己的参数值,以此为格式:

population 0
gK 9
gNa 35
gL 0.1
population 1 
gK 9
gNa 35
gL 0.1

使用ifstream加载文件,使用getline和stringstream解析。

我尝试制作一个循环,使得当遇到包含" supers 0"的线时,其参数会根据模板" contents>> param_name>> param_val",按行读取,将参数名称与预期的字符串进行比较,其值分为相应的指针数组(即:总体0,GK = 9进入GK [0])

达到最后一个预期的参数,或达到下一个人群(i 1),跳到文本中的下一个人群(i 1)。

void Parameters::Initialize(ifstream & pfile) {
 stringstream char_content;
 string temp;
 string line;
 string param_name;
 double param_val{ 0 };
 while (getline(pfile, line)) {
    stringstream contents(line);

    if (contents.rdbuf()->in_avail() == 0) { // if 
        continue;
    }
    if (!(contents >> param_name >> param_val)) { 
        printf("error reading line from file. position: file %s line %dn", __FILE__, __LINE__);
        throw "error reading file";
    }

for (int i { 0 }; i <= 2; ++i) { 
        if ((param_name.compare("Population") == 0) && (param_val == i)) { //if condition satisfied, get subsequent lines up to next population
        if (param_name.compare("gK") == 0); gK[i] = param_val;
        if (param_name.compare("gNa") == 0); gNa[i] = param_val;
        if (param_name.compare("gL") == 0); gL[i] = param_val;
        if ((param_name.compare("Population") == 0) && (param_val == i + 1)) continue;
        }
    }
}
}
int main (){
    cin >> file; // .txt file
    std::ifstream paramFile(file);
    P.Initialize(paramFile);
}

如果有人可以帮助制作工作版本。

阅读stringstream后,您必须继续读取文件才能获取gK的值,等等。

param_val称为int。这样,您可以将param_valint计数器进行比较。

param_name与较低的情况进行比较"population"

gK等可以声明为 std::vector,使用 push_back方法将值添加到 vector

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;
std::vector<double> gK, gNa, gL;
void Initialize(ifstream & pfile) 
{
    string line, param_name;
    int param_val;
    int counter = 0;
    while(getline(pfile, line)) 
    {
        stringstream contents(line);
        if(contents.rdbuf()->in_avail() == 0) 
            continue;
        if(contents >> param_name >> param_val)
        {
            if(param_name == "population" && param_val == counter)
            {
                double val;
                pfile >> line >> val;
                gK.push_back(val);
                if(line != "gK") cout << "errorn";
                pfile >> line >> val;
                gNa.push_back(val);
                if(line != "gNa") cout << "errorn";
                pfile >> line >> val;
                gL.push_back(val);
                if(line != "gL") cout << "errorn";
                counter++;
            }
        }
    }
    for(int i = 0; i < counter; i++)
    {
        cout << "population " << i << "n";
        cout << "gK " << gK[i] << "n";
        cout << "gNa " << gNa[i] << "n";
        cout << "gL " << gL[i] << "n";
    }
}