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

标签 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;
    }

我遇到了这个错误: 二进制“>>”:未找到采用“Mydata”类型的右手操作数的运算符(或没有可接受的转换)。

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

最佳答案

在没有查看其余代码的情况下,我想我可以肯定地说这就是问题所在:

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];
 }

关于C++使用getline从文本文件数据类型作为结构读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21667873/

相关文章:

c++ - 在一行中将 int 写入 std::ofstream::write()

C++,转换字符串,使连续下划线序列成为单个下划线

c++ - 在从 POD 结构继承的类中定义复制构造函数

c++ - 如何在不传递大量参数的情况下处理类的 "many small functions"的想法?

C++ 集 - 并集、差集、交集 - 导致 vector 删除迭代器错误(超出范围)

python - 是否有 C++11 等同于 Python 的 @property 装饰器?

c++ - C/C++函数递归

c++ - c++什么时候实例化方法?

c++ - 非常量左值引用类型 _normal_iterator<> 无法在 gcc 中绑定(bind)类型为 _normal 的临时迭代器

c++ - 'setprecision' 不是 ‘std’ 的成员