0

这实际上是我第一次使用这个网站:通常我能够从以前的帖子中找到解决方案,但这次我无济于事。无论如何,我的问题是我试图解析一个包含逗号和括号的文件。它还包含字符串和双精度,我需要将它们从字符串更改为双精度,以便我可以使用数据。我做了一个结构来存储数据。

struct Artery{
string segment; string name;
double length; double radius; double wall_thickness;
double young_modulus; double compliance;

Artery(string seg, string n, double l, double r, double w, double y, double c)
    : segment(seg), name(n), length(l), radius(r), wall_thickness(w), young_modulus(y), compliance(c){}
};

数据格式如下:

(节段、名称、长度、半径、壁厚、杨氏模量、顺应性)
(2A,Aorta_Ascendens,2、1.47、.164、4、53.4)
(2B,Aorta_Ascendens,2、1.44、.161、4、51.0)
( 3A, Arcus_Aorta, 2, 1.12, .132, 4, 29.6)

我真的只是 C++ 语言的初学者(实际上现在正在学习有关该主题的大学课程)并且我们还没有涵盖使用指针的低级编程,因此我知道通常用于解析这种事物。我能得到一些帮助吗?我真的不知道如何让它工作。

以下是我目前在尝试解析文件的过程中所拥有的内容。我想最终得到一个动脉向量,作为我访问信息的基础。

void read_data(vector<Artery>& v, ifstream& ifs){
//reads and seperates file for arterial data (currently from the westerhoff model)
vector<string> data_string;
while (!ifs.eof){
    string data_set = " ";
    getline(ifs, data_set);
    data_string.push_back(data_set);
}

for (int i = 0; i < data_string.size(); ++i){
    string seg; string n;
    double l; double r; double w; double y; double c;

    istringstream iss(data_string[i]);




}

}

回顾一下:我需要帮助来解析具有上述格式的文件,然后将该格式转换为动脉。然后我想将它们编译成动脉向量,以便以后访问它们。

谢谢,

扎夫

4

1 回答 1

0

有很多方法可以做到这一点。

假设您的文件流ifs已经初始化并且is_open(也就是说您已经完成了流的检查,然后您一次性完成所有操作(与您的版本相比,您的运行时间至少减少了两倍):

void read_data(std::vector<Artery>& v, std::ifstream ifs) {
    std::vector<std::string> data_strings;

    std::string temp;

    //read the file by lines
    while(std::getline(ifs, temp)) {
        //store the line (included for completeness)
        data_strings.push_back(temp);

        //as you didn't state if your lines began and ended with parentheses
        //I opted to cover removal of them:
        size_t begin = temp.find("(");//as there is only 1
        size_t end = temp.find(")");//as there is only 1

        temp = temp.substr(begin+1, end-1);

        std::istringstream iss(temp);
        Artery artery;

        int col = 1;//the current column

        //here we're going to use the stringstream to tokenize the string by commas
        //using std::getline
        while (std::getline(iss, temp, ',')) {
            std::istringstream is(temp);//this is another string stream initialized to the token (which may or may not be a string)
            //determine which artery property to modify based on the column number
            switch(col) {
                case 1:
                    is >> artery.segment;
                    break;
                case 2:
                    is >> artery.name;
                    break;
                case 3:
                    is >> artery.length;
                    break;
                case 4:
                    is >> artery.radius;
                    break;
                case 5:
                    is >> artery.wall_thickness;
                    break;
                case 6:
                    is >> artery.young_modulus;
                    break;
                case 7:
                    is >> artery.compliance;
                    break;
                default:
                    std::cerr << "Invalid column!\n";
            }
            ++col;
        }

        //now the artery has been correctly initialized, we can store it:
        v.push_back(artery);
    }
}

你会注意到这个版本没有使用Artery你提供的构造器。它本来可以使用,但从您定义的方式Artery来看,它非常类似于 POD(Plain-Old-Data 类型);因此,我已在此解决方案中对其进行了处理。

另外,正如你我不确定括号是否是每个组成行的一部分,我已经通过删除它们来相应地对待它们。(当然,如果您的数据不包含这些,您可以轻松删除处理该删除的代码)。

笔记:

我对字符串流提取运算符 ( >>) 的使用不会检查是否正确分配。但是,由于这是一个幼稚的例子,你可以为自己做这件事。

于 2013-11-03T05:49:57.677 回答