Что может быть лучше для получения C++ текстовых данных в программе, чем использование fstream

Это очень сложный вопрос, так как я не знаю, как правильно его задать.

Я написал программу, которая будет каждый раз читать одни и те же текстовые данные при загрузке. Текстовые данные - это список слов в словаре, и программа решает головоломки типа анаграммы (такие как Jumble, Boggle, Scrabble и т. Д.). Эти текстовые данные никогда не меняются. В настоящее время я использую для чтения текстовый файл, который ДОЛЖЕН находиться в той же папке, что и созданный.exe. Это предполагает, что пользователь не просто войдет и не сотрет, отредактирует или иным образом повредит текстовый файл или что-то действительно в пределах возможностей пользователя. Не только это, но и блокировка файла и его чтение - очень медленные операции.

Большая часть того, что делает программа, - это преобразование файла.txt в абстрактный тип данных (ADT), который сортирует слово в "подпись", а затем создает набор слов с такой же подписью. Эти наборы хранятся в структуре (называемой здесь картой), которая является структурой данных типа ключ: значение, где ключ является подписью. В любом случае эта информация не имеет отношения к вопросу, достаточно просто сказать, что при загрузке мне нужно создать свой ADT в памяти. Я ищу более сложный способ, чем текстовые файлы.

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

Я понимаю базы данных, но опять же, похоже, что это зависит от внешнего файла. Я видел сообщения, в которых говорится о хранении данных в файле.h, но они всегда хотят создать массив символов (char[i]), который потребует преобразования этих данных в мой ADT, и это снова кажется пустой тратой времени, когда программа загружается. (зачем вообще преобразовывать его в массив символов, чтобы просто прочитать его обратно в ADT?)

    /*
     * Project: myJumble
     * Created by CS106 C++ Assignment Wizard 0.1
     *
     * Name: Brad Beall
     * Section: Life
     * This code will solve the jumble puzzles in the newspaper.
     */
    
    #include <fstream>
    #include <iostream>
    #include "simpio.h"
    #include "map.h"
    #include "set.h"
    #include "genlib.h"
    
    //This function swaps two characters. 
    void Swap(char &ch1, char &ch2)
    {
        char tmp = ch1;
        ch1 = ch2;
        ch2 = tmp;
    }
    
    //This function sorts all the chars in a word in alphabetical order
    string SortWord(string inWord)
    {
        
        inWord = ConvertToLowerCase(inWord);
        //these two for loops will sort the string alphabetically
        // - idea is starting from the front, find the 'smallest' character in the string.
        //   (where a is 'smaller' than b)
        //   then move that smallest character to the front of the string
        //   now move to the next character and again look for the smallest character.
        //   Example: for "peach", first move the 'a' to the front to form "apech", then move 'c' to form "acpeh"...
        for (int i = 0; i < inWord.length(); i++) {
            int minIndex = i;
            for (int j = i+1; j < inWord.length(); j++)
            {
                if (inWord[j] < inWord[minIndex])
                {
                    // looking for the 'smallest' character
                    minIndex = j;
                }
            }
            Swap(inWord[i], inWord[minIndex]);
        }
    
        return inWord;
    }
    
    void BuildDictionary(Map<Set<string> > &kDict, ifstream &in)
    {
        string nextWord = "";
        while(true)
        {
            //read in the next word from the dictionary
            in >> nextWord;
            if (in.fail()) break;
            //sort letters alphabetically using SortWord, use that as the key 
            // and then add that key:value pair to the set.
            kDict[SortWord(nextWord)].add(nextWord);
        }
    }
    
    //this function prints a set
    void PrintSet(Set<string> &inputSet)
    {
        Set<string>::Iterator it = inputSet.iterator();
        while (it.hasNext())
        {
            cout << it.next() << endl;
        }
    }
    
    int main ()
    {
        ////debug the function: string SortWord(string inWord)
        //cout << "Enter a word to sort" << endl;
        //string tempString = GetLine();
        //tempString = SortWord(tempString);
        //cout << tempString;
    
        //building the dictionary may take some time.
        cout << "Loading the dictionary.  This may take some time." << endl;
    
        //read in the text file with all dictionary words
        ifstream in;
        in.open("enable1.txt");
        //call the member function that will create our data structure
        //this will be a MAP:
        // - key: the alphabetized letters from a word, or the word's "signature"
        // - value: a Vector of words with the matching signature
        Map<Set<string> > keyedDictionary;
        BuildDictionary(keyedDictionary, in);
    
        while(true)
        {
            //prompt user for a word to solve
            cout << "Enter a jumbled word to solve." << endl;
            cout << "Type '0' to exit." << endl << endl;
    
            string solveWord = GetLine();
            if(solveWord == "0"){
                break;
            }
    
            //sort the word into a signature key
            solveWord = SortWord(solveWord);
            //call the PrintSet(Set) member function to print the set of solutions for this signature key
            PrintSet(keyedDictionary[solveWord]);
        }
    
    
        return 0;
    }

0 ответов

Другие вопросы по тегам