读入字典并打印出给定长度的单词

时间:2014-05-19 21:06:49

标签: c++ file dictionary

我正在尝试将我用C编写的旧程序转换为C ++。其中一个部分需要在字典文件中读取,并将每个单词放入仅包含该长度的单词的向量中。所有较小的向量将被放入一个更大的外部向量中。在这个基本的例子中,我试着用几个单词读出并打印出给定大小的单词。当我尝试测试它时,即使文件中存在该大小的单词,也不会打印出任何单词。这段代码有什么问题?

#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>  
using namespace std;

vector< vector<string> >readDictionary(void)
{
    vector< vector<string> > outer;
    vector<string>::iterator iterator;
    int letters;
    ifstream dict;
    for(int i = 0; i < 29; i++)
    {
        vector<string> inner;
        outer.push_back(inner);
    }
    dict.open("dictionary.txt");
    if(!dict.is_open())
    {
        cout << "Error opening the dictionary. Exiting" << endl;
        exit(1);
    }
    while(!dict.eof())
    {
        string word;
        getline(dict,word);
        if(word.size() > 0)
        {
            vector<string> inner = outer.at(word.size() - 1);
            inner.push_back(word);
        }
    }
    cout << "Letters: ";

    cin >> letters;

    vector<string> inner = outer.at(letters - 1);
    for(iterator = inner.begin(); iterator != inner.end(); iterator++)
    {
        cout << *iterator << endl;
    }
    return outer;
}

3 个答案:

答案 0 :(得分:2)

主要问题是vector::at()返回对它存储的任何类型对象的引用。但是你没有在'if'语句中使用引用。你的行:

vector<string> inner = outer.at(word.size() - 1);

正在制作所需矢量的副本,然后当该副本超出范围时销毁该副本。

尝试将其替换为:

vector<string>& inner = outer.at(word.size() - 1);

对'for'循环上方的行进行相同的操作。

答案 1 :(得分:1)

简单的拼写错误。你忘了在这一行中使用引用:

            vector<string> inner = outer.at(word.size() - 1);

使用代码,它会复制矢量,添加它,然后销毁它。

答案 2 :(得分:0)

只是一个建议,您可以使用map键,其大小与单词大小相同,并且vectorstring个,请参阅下面的代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <map>

std::map<int, std::vector<std::string>> readDictionary(char const *filename)
{
  std::map<int, std::vector<std::string>> out;
  std::ifstream dict(filename);
  if (!dict.is_open()) throw std::runtime_error("Error opening the dictionary.");
  while (!dict.eof()) {
    std::string word;
    std::getline(dict, word, ' ');
    if (!word.empty()) out[word.size()].push_back(word);
  }

  return out;
}

int main()
{
  auto v = readDictionary("dictionary.txt");
  for (auto i : v) {
    std::cout << "Length " << i.first << ":" << std::endl;
    for (auto j : i.second) std::cout << "    " << j << std::endl;
  }
  return 0;
}