C ++: нет жизнеспособных перегруженных '=' data.end () -1 = '\ 0' - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь создать программу, которая фильтрует речевой текст, удаляет все нежелательные символы («,», «?» И т. Д. »), А затем создает новую речь, в которой слова перемешиваются на основекакие слова следуют или предшествуют им. Так, например, если у вас был адрес Геттисберга:

Четыре десятка и семь лет назад наши отцы породили на этом континенте новую нацию, зачатую в Свободе,и посвященный утверждению, что все люди созданы равными.

моя программа взяла бы этот текст, поместил бы его в набор строк, т.е. ["Four","score","and","seven",...."continent,"..."Liberty,"..."equal."] Затем он удалил бы любые нежелательные символы из каждой строкииспользуя c ++ .erase и c ++ .remove, например "," или "." и прописные буквы. После этого у вас будет отфильтрованная строка, такая как ["four","score","and","seven",...."continent"..."liberty"..."equal."]

После этого слова будут преобразованы в новыйсвязная, смешная речь, такая как: «Семь лет назад наши отцы задумались над мужчинами ...» и т. д.

Это было просто для того, чтобы вы знали масштабы этого проекта. Моя проблема на данный момент должналибо с использованием моего итератора правильно, либо с нулевыми терминаторами.

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 
#include <set> 
#include <iterator> //iterates through sets
#include <algorithm>

using namespace std;

int main() {
    set <string> speechSet;
    set <string> ::iterator itr; //forgot what :: means. Declares iterator as set
    int sum = 0;
    int x;
    string data;
    ofstream out;
    string setString;

    ifstream speechFile; //declare output file stream object. Unknown type name

    speechFile.open("./MySpeech");

    if (!speechFile) {
        cerr << "Unable to open file " << endl;
        exit(1);
    }

    char unwantedCharacters[] = ".";

    while (!speechFile.eof()) {
        speechFile >> data; //speechFile input into data
        for (unsigned int i = 0; i < strlen(unwantedCharacters); ++i) {
            data.erase((remove(data.begin(), data.end(),
                unwantedCharacters[i]), data.end())); //remove doesn't delete.    
            data.end() - 1 = '\0'; //Reorganizes
            cout << data << endl;
        }
        speechSet.insert(string(data));
    }

//Go through each string (word) one at a time and remove "",?, etc.
    /*for(itr = speechSet.begin(); itr != speechSet.end(); ++itr){
        if(*itr == ".")//if value pointed to by *itr is equal to '.'
            itr = speechSet.erase(itr);//erase the value in the set and  leave blank
            cout << " " << *itr;//print out the blank
        else{
            cout << " " << *itr;
        }
    }*/

    speechFile.close();
    return (0);

}

Я получаю сообщение об ошибке error: no viable overloaded '='.Сначала я подумал, что это может быть связано с тем, что .end () не является командой для строки C ++, но я проверил документацию, и это не должно быть проблемой несоответствующих типизированных данных.Тогда я подумал, что, возможно, придется установить значение итератора itr равным концу данных.

iterator itr = data.end() - 1;

, а затем разыменовать этот указатель и установить его равным нулевому терминатору

itr* = '\0';

Это устранило ошибку перегрузки, но у меня все еще была другая ошибка use of class template 'iterator' requires template arguments.Дайте мне знать, если понадобятся дополнительные разъяснения.

1 Ответ

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

В цикле for используйте auto для итератора, чтобы вам не приходилось указывать его тип, например:

for(auto itr = speechSet.begin(); itr != speechSet.end(); ++itr){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...