2014-03-19 46 views
0

我正在尝试编写代码,它将逐行将数字数据从CSV传递到对象的矢量。该对象的结构如下:对象本身(我们称之为CS)是一个封闭空间,其中驻留有一个对象向量(称为Points),每个对象都有一个带有3个变量的对象向量(Features)。这些特征中的前两个变量是该特征的描述符,第三个是特定Point[i].Feature[j]的实际值。每个点具有相同的一组特征,除了第三个值不同之外,描述符也是相同的。 (编辑:可悲的是我不能改变这个结构,因为它是我手中的一个更大的框架的一部分)将CSV读入对象中的矢量

目前,我的CSV每个功能有一列,前两行是描述符适用于所有点和其余行是每个点的第三个特征值。自从我的C++入门课程开始,我发现很难想出一个快速实现这个的方法,因为我的CSV可能会变得相当大(我目前的上限是拥有2000个功能的50000个点,这可能会增加)我不想做一些愚蠢的事情,比如每次重读前两行。我环顾四周,大多数CSV解决方案都涉及字符串CSV,我不必处理这些字符串,以及存储CSV的简单数组对象。对我而言,问题就是每当我到达线的末端时重新启动一个关卡,然后重新启动下一个关卡的过程,我无法想到任何事情。有小费吗?

回答

0

您可以创建一个临时数组对象,该对象包含每列的两个描述符,然后在第一行中读取并从中创建对象Point。之后,您可以复制上面一行中的Point的描述符,例如Point[i-csvWidth],并释放数组Descriptor

+0

谢谢,但这部分是至少我此刻的后顾之忧。我正在考虑在实际数据的循环之前做一个确切的事情,但我不确定是否可以在关闭该循环后离开的文件中轻松恢复。 – user3371024

+0

然后只是不要关闭流。在初步循环之外构建它,并为所有输入使用相同的实例。 – user783920

0

我猜我几乎那里,只是使用了错误类型的变量,在阅读。

fstream myFile; 
    myFile.open(filePath.c_str()); 
    if(!myFile){ 
    cout << "File \"" << filePath << "\" doesn't exist, exiting program." << endl; 
    exit(EXIT_FAILURE); 
    } 

    string line,line2,line3; 
    Points.clear(); 

    //gets the range row 
    getline(myFile,line); 
    istringstream lineStream(line); 
    //gets the nomin row 
    getline(myFile,line2); 
    istringstream lineStream2(line2); 
    //gets the first person's traits 
    getline(myFile,line3); 
    istringstream lineStream3(line3); 

    CultVec originalCultVec = CultVec(RNG); 

    int val,val2,val3,val4; 
    while (lineStream >> val && lineStream2 >> val2 && lineStream3 >> val3) { 
     Feature feature; 
     feature.Range = (char)val; 
     feature.Nomin = (bool)val2; 
     feature.Trait = (char)val3; 
     originalCultVec.addFeature(feature); 
    } // while 
    Points.push_back(originalCultVec); 

    while (getline(myFile,line)) { 
    int i = 0; 
    CultVec newVec = CultVec(RNG); 
    istringstream lineStream4(line); 
    while (lineStream4 >> val4) { 
     Feature newFeat = originalCultVec.getFeature(i); 
     newFeat.Trait = (char)val4; 
     newVec.addFeature(newFeat); 
     i++; 
     } 
    Points.push_back(newVec); 
    }