如何从文件一次读入数组一个单词

时间:2018-11-18 11:06:18

标签: c++ arrays file

知道这是一个愚蠢的问题!

但是我无法理解如何使用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 :(得分:1)

我能想到的最简单的解决方案是:

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

答案 1 :(得分:0)

关于πάνταῥεῖ的建议

我已经尝试过:

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

它对我有用。我确实认为使用向量更优雅,因此已经接受了该答案。

还提出了将其发布为自我回答而非编辑的建议-我有点同意这是明智的,所以我继续这样做。

答案 2 :(得分:-1)

最简单的方法是使用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