如何在c ++中解析引号和逗号

时间:2013-12-10 08:10:35

标签: c++ comma scanf quotation-marks

我有一个要解析的大文件。以前,它由spacecomma分隔,我使用sscanf(string, "%lf %lf ", &aa, &bb);将数据存入我的程序。

但现在数据格式更改为"122635.670399999","209705.752799999",同时带有逗号和引号。我不知道如何处理它。实际上,我以前的代码是在网上找到的,我很难找到适合这类问题的文件。如果你能向我推荐一些会很棒。感谢。

2 个答案:

答案 0 :(得分:4)

而不是读取字符串,然后从字符串中删除逗号和引号,最后将数据转换为数字,我可能会创建一个区域设置对象,将逗号和引号分类为空格,使用该区域设置填充流,并且在没有进一步说明的情况下阅读这些数字。

// here's our ctype facet:
class my_ctype : public std::ctype<char> {
public:
    mask const *get_table() { 
        static std::vector<std::ctype<char>::mask> 
            table(classic_table(), classic_table()+table_size);

        // tell it to classify quotes and commas as "space":
        table['"'] = (mask)space;
        table[','] = (mask)space;
        return &table[0];
    }
    my_ctype(size_t refs=0) : std::ctype<char>(get_table(), false, refs) { }
};

使用它,我们可以读取这样的数据:

int main() { 
    // Test input from question:
    std::string input("\"122635.670399999\",\"209705.752799999\"");

    // Open the "file" of the input (from the string, for test purposes).
    std::istringstream infile(input);

    // Tell the stream to use the locale we defined above:
    infile.imbue(std::locale(std::locale(), new my_ctype));

    // Read the numbers into a vector of doubles:
    std:vector<double> numbers{std::istream_iterator<double>(infile),
                               std::istream_iterator<double>()};

    // Print out the sum of the numbers to show we read them:
    std::cout << std::accumulate(numbers.begin(), numbers.end(), 0.0);
}

请注意,一旦我们使用我们的ctype facet使用语言环境填充了流,我们就可以读取数字,就好像逗号和引号根本不存在一样。由于ctype facet将它们归类为空白区域,因此除了充当其他东西之间的分隔符之外,它们完全被忽略。

我指出这一点主要是为了表明在此之后的任何处理都没有魔力。如果您愿意,可以使用istream_iterator代替(例如)double value; infile >> value;,这没有什么特别之处。您可以通过任何通常读取由空格分隔的数字的方式读取数字 - 因为就流关心而言,完全您拥有的数据。

答案 1 :(得分:1)

如果你在字符串中有逗号分隔的数据,那么只需从字符串中删除",如: 比方说string是str1

str1.erase(std::remove(str1.begin(), str1.end(), '"'), str1.end());

这将删除所有"

    //Use below code to convert string into float
    float f1;    
    std::stringstream ss;
    ss<<str1;
    ss>>f1;