Чтение строк из файла в массив - PullRequest
1 голос
/ 26 апреля 2011

Эй.Я пытаюсь прочитать строки в массив из файла, который содержит список слов.Это так, чтобы я мог проверить, являются ли строки реальным словом, посмотрев, существуют ли они внутри моего массива.У меня все работает, кроме сравнения.Мой бинарный поиск даже проходит мимо рассматриваемого слова.Когда он сравнивает два одинаковых слова, он все равно возвращает ложь.Я думаю, что проблема, вероятно, заключается в том, как я добавляю слова, потому что функция string.compare () работает нормально.Вот этот код.Я хотел бы помочь.Спасибо.

  ifstream dictFile;
  dictFile.open("dictionary.txt");
  if (!dictFile) // testing if file open
    {
      cout << "Error opening dictionary file" << endl;
    }
  int index = 0; // dictionary must progress start at line 1
  while(!dictFile.eof())
    {
      getline(dictFile,dictionary[index]);
      index++;
    }
  dictFile.close();

Что-то не так в том, как я это делаю?

РЕДАКТИРОВАТЬ Вот и код сравнения

bool database::is_word(string word)
{
  int ii;
  int comp;
  int min = 0;
  int max = dictSize;
  // this will go into the dictionary and look for the word
  // it uses a binary search pattern
while (min<=max)
    {
      ii = (min+max)/2;
      comp = word.compare(dictionary[ii]);
      cout <<dictionary[ii];
      if (comp==0)
    {
      cout << word<< " is a word!" << endl;
      return 1;
    }
      else if (comp < 0)
    {
      max = ii-1;
    }
      else
    {
      min = ii+1;
      }
      }
 cout << word << " is NOT a word!" << endl;
  return 0;
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Снова не функция eof ()!Вы хотите:

while( getline(dictFile,dictionary[index]) ) {
  index++;
}

(при условии, что dictionary - это что-то разумное, чего не может быть), потому что eof () не предсказывает, будет ли работать следующее чтение.

И где ойоткуда люди берут это eof ()?Это как болезнь!

0 голосов
/ 26 апреля 2011

Вот как бы я делал всю программу, если бы моей целью была краткость, а не производительность.

// read the dictionary 

vector<string> dictionary;
{
  ifstream dictionary_file("dictionary.txt");
  istream_iterator<string> begin(dictionary_file);
  istream_iterator<string> end;
  while( begin != end )
    dictionary.push_back( *begin++ );
  sort( dictionary.begin(), dictionary.end() );
}

// read the input file and test against the dictionary

{
  ifstream input_file("input.txt");
  istream_iterator<string> begin(input_file);
  istream_iterator<string> end;
  while( begin != end )
  {
    string input = *begin++;
    vector<string>::iterator it = lower_bound( dictionary.begin(), dictionary.end(), input );
    if( it != dictionary.end() && *it == input )
      cout << input << " found!" << endl;
    else
      cout << input << " not found!" << endl;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...