如何从C ++中读取文件中的结构化数据?

时间:2009-11-18 02:10:56

标签: c++ file-io

我有一个数据文件,我需要从每行读取数据并存储它。然后根据其中一个数据的值将数据存储在一个数组中,这样我就可以计算出所有这些数据的中值。

数据线是人口统计信息,具体取决于地理位置,人员地址。我需要捕捉他们的年龄,然后找到居住在特定街道上的人的中位数。

所以数据集是150,000条记录,每条记录有26个字段,其中很多字段是地址的一部分,其他字段只是数字,年龄,街道号等等。

所以我需要做的是读取该行,然后如果记录中的特定字段满足某个条件,我需要从记录中捕获一个字段并将其存储在一个数组中,以便我可以计算出的中位数例如,住在“橡树街”的人。

我有条件逻辑,可以解决这个问题,但我对C ++中的iostream对象感到不舒服,比如实例化一个ifstream对象,然后从文件本身读取。

哦,我忘了数据是逗号分隔的值文件。

2 个答案:

答案 0 :(得分:3)

以逗号分隔的输入:

using namespace std;
ifstream file;
string line;
while(getline(file, line)) {
    istringstream stream(line);
    string data[3];
    for(int ii = 0; ii < sizeof data / sizeof data[0]; ++ii)
        if(!getline(stream, data[ii], ','))
            throw std::runtime_error("invalid data");
    // process data here
}

对于以空格分隔的输入(原始答案):

using namespace std;
ifstream file;
string line;
while(getline(file, line)) {
    int datum1;
    string datum2;
    double datum3;
    istringstream stream(line);
    if(!(line >> datum1 >> datum2 >> datum3))
        throw std::runtime_error("invalid data");
    // process data here
}

这些方法不会赢得任何奖项,但希望它们相当可靠且易于理解。

答案 1 :(得分:1)

对于SQL轻型嵌入式数据库来说,这听起来像是一个完美的问题。然后,您可以拥有任意数量的标准SQL功能,而无需重写轮子。