#c #database #file #fstream #txt
#c #База данных #файл #fstream #txt
Вопрос:
это очень сложный вопрос, поскольку я не уверен, как правильно его задать.
Я написал программу, которая будет каждый раз считывать одни и те же текстовые данные при загрузке. Текстовые данные представляют собой список слов в словаре, и программа решает головоломки типа анаграммы (например, Jumble, Boggle, Scrabble и т. Д.). Эти текстовые данные никогда не меняются. В настоящее время я использую для чтения текстовый файл, который ДОЛЖЕН присутствовать в той же папке, что и созданный .exe. Это предполагает, что пользователь не будет просто входить и удалять, редактировать или иным образом повреждать текстовый файл или что-то действительно возможное для пользователя. Не только это, но и блокировка файла и его чтение являются очень заметно медленными операциями.
Большая часть того, что делает программа, — это преобразование файла .txt в абстрактный тип данных (ADT), который сортирует слово в «подпись», а затем создает набор слов с одинаковой подписью. Эти наборы хранятся в структуре (называемой здесь map), которая представляет собой структуру данных типа ключ: значение, где ключом является подпись. В любом случае эта информация не имеет отношения к вопросу, достаточно просто сказать, что при загрузке мне нужно создать свой 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 amp;ch1, char amp;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> > amp;kDict, ifstream amp;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> amp;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;
}
Комментарии:
1. В настоящее время я использую для чтения текстовый файл, который ДОЛЖЕН присутствовать в той же папке, что и созданный .exe. Это предполагает, что пользователь не будет просто входить и удалять, редактировать или иным образом повреждать текстовый файл или что-то действительно возможное для пользователя. Для этой части хорошая программа будет иметь код обработки ошибок. Например, вместо
in.open("enable1.txt");
этого вы должны проверить возврат из open и сообщить пользователю, если файл не существует.2. Если ваша карта просто никогда не меняется, вы можете просто создать статическую переменную карты в другом файле cpp и жестко запрограммировать значения карты. Таким образом, вы не полагаетесь на внешний файл.
3. @AyxanHaqverdili Это отличная идея. Спасибо.
4. ОБНОВЛЕНИЕ — жизнь потрясающая. Я написал в свою исходную программу вместо того, чтобы она считывала текстовый файл в память, я заставил ее прочитать текстовый файл, а затем написал другой текстовый файл, который содержал «жестко закодированные» строки кода и данные из текстового файла, которые я скопировал / вставил в другой .cpp-файл! Довольно весело.