Как получить доступ к отдельному слову из вектора C ++? - PullRequest
0 голосов
/ 29 апреля 2018

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

#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;



int main(){ 

  ifstream in;
  string line, file_name;
  vector <string> phrase;
  int total_words, total_letters, total_chars;

  cout << "PIG LATIN PROGRAM" << endl; 

  cout << "Which file are you accessing? : ";
  cin >> file_name;

  in.open(file_name);

  if (in.fail()) cout << "\nFile not found!" << endl;


  while(getline(in, line)) phrase.push_back(line);



    for(int i = 0; i < phrase.size(); i++){

    int limit = phrase.size() - 1;
    while(i < limit &&  phrase[i] == phrase[i]){
        i++;

    }
       cout << phrase[i];


}   

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

phrase[i] == phrase[i]
Ну, это просто избыточно. Это всегда будет возвращать true для вектора, содержащего строки.

for(int i = 0; (...); i++){
   while( (...) ){
       i++;
   }
}

Вы изменяете переменную i дважды в этом единственном for loop. Один раз в третьем параметре for и один раз во внутреннем while loop. Это почти никогда не хорошая идея .

Здесь происходит то, что вы устанавливаете i=0, а затем немедленно устанавливаете его так, чтобы он указывал на последний элемент вектора (поскольку второе условие в while всегда выполняется).

Затем вы выводите этот элемент на консоль, которая является последней строкой вашего текстового файла.

То, что вы хотите сделать, это:
1. Загрузите текстовый файл построчно в вектор.
2. Каждый элемент вектора будет содержать одну строку.
3. Разбейте каждую строку на вектор СЛОВ (через пробел).
4. Работа с результирующим вектором.

или ферапс:
1. Загрузите файл слово за словом в начале.

vector<string> words; 
copy( istream_iterator<string>{YourFileStream}, istream_iterator<string>{}, back_inserter{words} ); // this will copy the content of file directly into vector, white-space-separated (no need for while loop to do it)
for ( auto i = phrase.begin(); i != phrase.end(); ++i ) // it's the proper c++ way of iterating over a vector. very similar, but variable i will point to every element of vector in order ( not just to the index of an element )
{
      // do some work on *i. at least: 
      std::cout << *i; // dereference operator (*) is needed here, since i doesn't hold index of an element, it's a "pointer" to an element
}

Если вам нужен первый подход (для различения слов в разных строках), здесь вы можете найти несколько отличных способов разделения строки любым разделителем (например, пробел): Самый элегантный способ итерации слова строки

0 голосов
/ 29 апреля 2018

Вы можете начать с разделения строки на phrase[i] в точках, где есть пробел:

std::istringstream iss{phrase[i]};
std::vector<std::string> words;
std::string word;
while (iss >> word)
    words.push_back(std::move(word));

std::istringstream создает входной поток - немного похожий на cin - который содержит полную строку текста, считанную из вашего файла и сохраненную в phrase[i]. Если вы затем используете >> word, он будет извлекать по одному пробелу из текста за раз.

Скажите, что ваша строка / phrase[i] вход содержит "the blue socks were her favourites", он будет красиво разделен на слова. Если в строке также есть пунктуация, то некоторые строки в words будут включать эту пунктуацию, например, "world.". Если вы заботитесь об этом, вы можете научиться использовать функции-члены std::string для поиска и редактирования строк.

В случае пунктуации вы можете использовать std::erase(std::remove_if(word.begin(), word.end(), std::ispunct), word.end()) чтобы удалить его (далее подробности / объяснение ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...