使用带有fstream的地图的Segfault

问题描述 投票:0回答:1

我正在尝试从文件中读取文本,并在此过程中跟踪文本的内容。如果之前未见过的单词被插入到地图中并初始化为1.如果已经看到(存在于地图中),那么该值就会递增。

如果我删除调用[]操作符的操作,那么文件的读取工作正常。为了确认读取文件成功,我将第一个文件的内容输出到输出文件中。

因此,向地图添加键/值时会出现问题。似乎我的代码在第二次进入while循环时会出现段错误。

这是一个简单的类,它充当单词计数器,以及一个处理文件打开,创建对象和读取文件的主方法。

#include <map>
#include <string>
#include <fstream>

using namespace std;

class WordCounter
{
public:

    map<string, int> words;

    WordCounter operator[] (const std::string &s)
    {
        ++words[s]; 
              // If we put a breakpoint here in GDB, then we can print out the value of words with GDB.
              // We will see that we sucessfully entered the first string.
              // But, the next time we enter the while loop we crash.
        }
    }
};

int main()
{
    WordCounter wc; 
    ifstream inFile;
    ofstream outFile;
    string word;
    inFile.open("input.txt");
    outFile.open("output.txt");

    while(inFile>>word)
    {
        outFile << word << " ";
        wc[word]; // This line seems to cause a segfault 
    }

    inFile.close();
    outFile.close();

}
c++ maps
1个回答
1
投票

就目前而言,您的代码有许多错误,无法编译。修复这些并添加成员函数以查看单词counter收集的统计信息后,我得到的结果与我预期的一样(并且没有段错误或类似的东西)。

#include <map>
#include <string>
#include <fstream>
#include <iostream>

using namespace std;

class WordCounter
{
public:

    map<string, int> words;

    void operator[] (const std::string &s)
    {
        ++words[s]; 
    }

    void show() {
        for (auto const& p : words) {
            std::cout << p.first << " : " << p.second << "\n";
        }
    }
};

int main()
{
    WordCounter wc; 
    ifstream inFile("input.txt");
    string word;

    while(inFile>>word)
    {
        wc[word]; 
    }
    wc.show();
}
© www.soinside.com 2019 - 2024. All rights reserved.