简体   繁体   中英

c++ How to read from a file into array one word at a time

I know this is a dumb question!

But I just CAN NOT get my head around how to read my file into an array one word at a time using c++

Here is the code for what I was trying to do - with some attempted output.

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];
      }
   }
}

I am trying to get each word (defined by a space between words) from the madLib.txt file into the listOfWords array so that I can then perform some character by character string manipulation.

Clearly I can read from a file and get that into a string variable - BUT that's not the assignment (Yes this is for a coding class at college)

I have read from a file to get integers into an array - but I can't quite see how to apply that here...

The simplest solution I can imagine to do this is:

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));
}

Anyways, you stated in your question you want to read one word at a time and apply manipulations. Thus you can do the following:

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);
   }
}

On the suggestion of πάντα ῥεῖ

I've tried this:

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];
   }
}

and it has worked for me. I do think using vectors is more elegant, and so have accepted that answer.

The suggestion was also made to post this as a self answer rather than as an edit - which I kind of agree is sensible so I've gone ahead and done so.

The most simple way to do that is using the STL algorithm... Here is an example:

#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"});
}

Instead of cin of course, you can use any istream object (like file )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM