#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 не требуется, ее достаточно, чтобы проверить, является ли c.length()==Длина слова
- Также может не потребоваться сохранение 2 векторов, поскольку файл считывается с помощью getline(), длина каждой строки может быть проверена на соответствие wordLength, а затем только push_back
- при многократной вставке в конце вектор лучше, чем список, учитывая временную сложность
Комментарии:
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;