C ++使用getline从文本文件数据类型读取为struct

时间:2014-02-10 01:59:41

标签: c++

我有一个文本文件:

a 1 b 6 e 4 h 2
r 5 q 1 a 2 e 2 b 3

高达300k线。每个字符都跟着它的价值。我想逐行读取这个文件,并在同一行中的每个2个字符之间进行配对。第一行的结果:

(a,b)
(a,e)
(a,h)
(b,e)
(b,h)
(e,h) 

我也计算每对的频率。代码:

    using namespace std;

    std::map<std::pair< char, int>, int>  CharP;

    struct Mydata
    {
        char myString;
        float value;


         friend std::istream &operator>>(std::istream &is, Mydata  &d) {
        {
                    string line;
            std::getline(is,line);
            return is >> d.myString>> d.value;

        }
    };


    int main()
    {
        std::ifstream in("Data.txt");



            std::vector<Mydata> data{ std::istream_iterator<Mydata>(in), std::istream_iterator<Mydata>() };

            for (std::vector<Mydata> ::iterator current = data.begin(); current != data.end(); ++current)
            {
                char a = current->myString;
                for (std::vector<Mydata> ::iterator current2 = ++current; current2 != data.end(); ++current2)
                {
                    char b = current2->myString;

                    auto itt = CharP.find(std::make_pair(b, a));

                    ++CharP[(itt != CharP.end()) ? std::make_pair(b, a) : std::make_pair(a, b)];

                } 
--current;

            }





        cout << " \nPress any key to continue\n";
        system("PAUSE");
        return 0;
    }

我收到了这个错误:  二进制'&gt;&gt;' :找不到哪个运算符采用'Mydata'类型的右手操作数(或者没有可接受的转换)。

我有另一个问题,因为我有大文件,我想知道是否有另一种方法比附加代码更快。

1 个答案:

答案 0 :(得分:3)

如果没有查看剩下的代码,我想我可以放心地说这就是问题所在:

friend std::istream& getline(std::istream &is, Mydata &d)

您是否打算在此声明中重载提取器?如果是这样,您应该知道提取器是运算符,即operator>>()。将getline替换为>>

friend std::istream& operator>>(std::istream &is, Mydata &d);

此外,非常不可读:

++CharP[(itt != CharP.end()) ? std::make_pair(b, a) : std::make_pair(a, b)];

替换为:

 if (itt != CharP.end())
 {
     auto p = std::make_pair(b, a);
     ++CharP[p];
 } else
 {
     auto p = std::make_pair(a, b);
     ++CharP[p];
 }