Копирование уникальной строки из одного списка в другой список из текстового файла

#c #c 14

#c #c 14

Вопрос:

Меня попросили составить список данных из текстового файла слов, который равен определенной длине букв, пользователь вводит требуемую длину, и функция создаст список всех слов одинаковой длины. Я попытался сделать это с помощью списка, но изменил его на вектор, но мне все равно не удалось заставить его работать. Я смог загрузить все слова из текстового файла в вектор (а также когда это был список), но только вставка слов заданной длины вызывала проблемы, и в вектор не было введено ни одного слова. Будет ли карта лучше?

     vector<string> wordListA;
    vector<string> wordListB;
    int count = 0;
    myfile.open(filename); // opening the filename given in command line
    if (myfile.is_open()) //testing if the file is opened or not
    {
        while (getline(myfile, line))
        {
            string newline;
            newline = line;
            wordListA.push_back(newline);
        }
        vector<string>::const_iterator it;
        it = wordListA.begin();
        for (it; it != wordListA.end(); it  )
        {
            string c = *it;
            if (c.length() == wordLength   1)
            {
                wordListB.push_back(c);
                count  ;
            }
        }
        cout << count << endl;

    }
  else
    {
        cout << "Error when opening file: " << filename << endl;
    }
  myfile.close();
}
  

Я думаю, что мой метод определения длины неверен. Я попробовал 4 разных метода, и ни один из них не сработал! Я думаю, что мне нужно использовать структуру данных списка, а не вектор.
ранее я пробовал это, что также, похоже, не сработало:

         string newline;
        newline= line; //load current line into nl

        if (int(newline.length()) == wordLength   1)
        {
            wordListA.push_back(newline); //append into list
        } 
  

Обновлено, но все еще не работает:

 while (getline(myfile, line))
        {
            string newline;
            newline = line;
            if (int(newline.length()) == wordlength)
            {
                wordListA.push_back(newline);
                unique  ;
            }
        }
  

Ответ №1:

 int main()
{
        vector<string> wordListA;
        int wordLength=3;
        string filename;
        string line;

        cin>>filename;

        ifstream myfile;

        myfile.open(filename); // opening the filename given in command line
        if (myfile.is_open()) //testing if the file is opened or not
        {
                while (getline(myfile, line))
                {
                        if(line.length()==wordLength)
                                wordListA.push_back(line);
                }
        }
        else
        {
                cout << "Error when opening file: " << filename << endl;
        }
        myfile.close();
        
        //print vector of strings
        for(auto i:wordListA)
                cout<<i<<endl;
}

  

Ответ №2:

  1. Длина слова 1 не требуется, ее достаточно, чтобы проверить, является ли c.length()==Длина слова
  2. Также может не потребоваться сохранение 2 векторов, поскольку файл считывается с помощью getline(), длина каждой строки может быть проверена на соответствие wordLength, а затем только push_back
  3. при многократной вставке в конце вектор лучше, чем список, учитывая временную сложность

Комментарии:

1. что значит «не требуется»? Я ищу способ составить список строк заданной длины, например, все слова длиной 4 попадут в listB

2. Моя проблема в том, что слова вообще не входят в список b

3. например, если вы хотите вставить слова длиной 5, то достаточно проверить c.length()==wordLength; поскольку c.length() выдаст 5, если слово имеет 5 символов

4. Изначально, @lorenz, я проверял длину во время чтения строк, но поскольку это не сработало, я сосредоточился на том, чтобы просто прочитать все слова, а затем попытаться решить мою проблему с длиной. Я изменил свои строки данных на списки, но все еще не могу заставить их вводить только строки заданной длины!

5. Я удалил 1 из вашей проверки условий, если (c.length() == wordLength 1) и выполнил ваш исходный код, он сработал. что эта строка напечатала после удаления » 1″ ? cout << count << endl;