Segfault используя карту с fstream - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь прочитать текст из файла и при этом отслеживаю содержание текста.Если слово, которое не было просмотрено до того, как оно было вставлено в карту и инициализировано значением 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();

}

1 Ответ

0 голосов
/ 19 февраля 2019

В нынешнем виде в вашем коде есть ряд ошибок, которые мешают его компиляции.После исправления этих ошибок и добавления функции-члена, чтобы увидеть статистику, собранную счетчиком слов, я получаю результаты примерно так, как я ожидал (и без ошибок, или что-то подобное).

#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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...