c ++ Как читать из файла в массив одно слово за раз - PullRequest
0 голосов
/ 18 ноября 2018

Я знаю это тупой вопрос!

Но я просто НЕ МОГУ понять, как читать мои файлы в массив по одному слову за раз, используя c ++

Вот код того, что я пытался сделать - с некоторой попыткой вывода.

void readFile()
{
   int const maxNumWords = 256;
   int const maxNumLetters = 32 + 1;
   int countWords = 0;
   ifstream fin;
   fin.open ("madLib.txt");
   if (!fin.is_open()) return;

   string word;
   while (fin >> word)
   {
      countWords++;
      assert (countWords <= maxNumWords);
   }

   char listOfWords[countWords][maxNumLetters];
   for (int i = 0; i <= countWords; i++)
   {
      while (fin >> listOfWords[i]) //<<< THIS is what I think I need to change 
                                    //buggered If I can figure out from the book what to
      {
         // THIS is where I want to perform some manipulations - 
         // BUT running the code never enters here (and I thought it would)
         cout <<  listOfWords[i];
      }
   }
}

Я пытаюсь получить каждое слово (определенное пробелом между словами) из файла madLib.txt в массив listOfWords, чтобы затем я мог выполнять некоторые символьные манипуляции со строками символов.

Очевидно, что я могу читать из файла и передавать его в строковую переменную - НО это не задание (Да, это для класса кодирования в колледже)

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

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Самый простой способ сделать это - использовать алгоритм STL ... Вот пример:

#include <iostream>
#include <iomanip>
#include <iterator>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<string> words;

    auto beginStream = istream_iterator<string>{cin};
    auto eos = istream_iterator<string>{};
    copy(beginStream, eos, back_inserter(words));    

    // print the content of words to standard output
    copy(begin(words), end(words), ostream_iterator<string>{cout, "\n"});
}

Вместо cin, конечно, вы можете использовать любой istream объект (например, file)

0 голосов
/ 18 ноября 2018

По предложению πάντα ῥεῖ

Я пробовал это:

void readFile()
{
   int const maxNumWords = 256;
   int const maxNumLetters = 32 + 1;
   int countWords = 0;
   ifstream fin;
   fin.open ("madLib.txt");
   if (!fin.is_open()) return;

   string word;
   while (fin >> word)
   {
          countWords++;
          assert (countWords <= maxNumWords);
   }
   fin.clear();
   fin.seekg(0);
   char listOfWords[countWords][maxNumLetters];
   for (int i = 0; i <= countWords; i++)
   {
  while (fin >> listOfWords[i]) //<<< THIS did NOT need changing
  {
     // THIS is where I want to perform some manipulations - 
     cout <<  listOfWords[i];
   }
}

и это сработало для меня. Я думаю, что использование векторов более элегантно, и поэтому принял этот ответ.

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

0 голосов
/ 18 ноября 2018

Самое простое решение, которое я могу себе представить, это:

void readFile()
{
   ifstream fin;
   fin.open ("madLib.txt");
   if (!fin.is_open()) return;

   vector<string> listOfWords;
   std::copy(std::istream_iterator<string>(fin), std::istream_iterator<string>()
            , std::back_inserter(listOfWords));
}

В любом случае, вы указали в своем вопросе, что хотите читать по одному слову за раз и применять манипуляции. Таким образом вы можете сделать следующее:

void readFile()
{
   ifstream fin;
   fin.open ("madLib.txt");
   if (!fin.is_open()) return;

   vector<string> listOfWords;
   string word;
   while(fin >> word) {
        // THIS is where I want to perform some manipulations
        // ...
        listOfWords.push_back(word);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...