程序未正确从文本文件中提取信息

时间:2014-03-02 19:24:51

标签: c++

我可以帮助找出错误的位置。我有2个文本文件,我需要从中提取信息。

第一种形式是

  1. WORD1
  2. WORD2
  3. WORD3
  4. 我只想把这些单词放到std :: vector中。文本文件中有5000个单词。当我在我的代码中放置一个小测试器并运行它时,我发现它只有729个单词。

    第二个文本文件的格式为

    a a 0 a b 5 a c 3

    etcetera

    我想把它们放到一个std :: map中,它将字符对映射到整数。当我在我的代码中放置一个小测试器并运行它时,我发现它向地图添加了零元素。

    以下是相关代码:

    class AutoCorrector
    { 
    
        public: 
        AutoCorrector(std::ifstream&, std::ifstream&);
        ~AutoCorrector();
        void suggest(std::string);
    
        private: 
        std::vector<std::string> wdvec;
        std::map<std::pair<char,char>,int> kdmap;
    
    
    };
    
    AutoCorrector::AutoCorrector(std::ifstream& wdfile, std::ifstream& kdfile) 
    {
        /* Insert 5000 most commond English words into a vector. 
           The file that is read was edit-copied copied from 
           http://www.englishclub.com/vocabulary/common-words-5000.htm
           and so the numberings must be ignored on each line in order
           to properly extract the words.
        */
        if (wdfile.is_open()) { 
            std::string line;
            while (std::getline(kdfile, line))
            {
                std::istringstream ss(line);
                std::string nb, thisWord;
                ss >> nb >> thisWord;
                wdvec.push_back(thisWord);
            }
            // test --- 
            std::cout << "wdvec size = " << wdvec.size() << std::endl;
            // -------
        }
        else
        {
            throw("Was not able to open key distance file.\n");
        }   
    
        /* Insert keyboard pairwise distances into a map.
           The file that is read from must have lines of the form
                a a 0
                a b 5
                a c 3
           etcetera, 
           indicating the distances between characters on a standard keyboard, 
           all lower-case letters and the apostrophe for a total of 27x27=729
           lines in the file.
        */
        if (kdfile.is_open()) { 
            std::string line;
            while (std::getline(kdfile, line))
            {
                std::istringstream ss(line);
                char c1, c2; 
                int thisInt;
                ss >> c1 >> c2 >> thisInt;
                std::pair<char,char> thisPair(c1, c2);
                kdmap.insert(std::pair<std::pair<char,char>, int> (thisPair, thisInt));
            }
            // test --
            std::cout << "kdmap size  = " << kdmap.size() << std::endl;
            // end test
        }
        else
        {
            throw("Was not able to open key distance file.\n");
        }
    
    
    }
    

    非常感谢StackOverflow C ++纯粹主义者提供的任何帮助。我愿意接受有关如何简化和优化代码的建议。最后,我正在尝试创建一个自动检测器,它可以搜索5000个最常用单词列表中最相似的单词。

1 个答案:

答案 0 :(得分:1)

27 * 27 = 729.因此,您的第一个矢量具有与第二个文件相同的行数。为什么?因为当您打算从kdfile阅读时,您正在阅读wdfile

while (std::getline(kdfile, line))
                    ^^^^^^

这意味着你正在读取成对距离文件中的所有内容,然后第二个循环没有任何内容可以提取。