функция поиска строки из файла - PullRequest
1 голос
/ 23 сентября 2011

Это код, который я написал для проверки наличия string's в файле:

bool aviasm::in1(string s)
{
ifstream in("optab1.txt",ios::in);//opening the optab
//cout<<"entered in1 func"<<endl;
char c;
string x,y;
while((c=in.get())!=EOF)
{
    in.putback(c);
    in>>x;
    in>>y;
    if(x==s)
    return true;
}
return false;
}

несомненно, что искомая строка находится в первом столбце optab1.txt, и всего в optab1.txt есть два столбца для каждой строки. Теперь проблема в том, что независимо от того, какая строка передается в качестве параметра s в функцию, она всегда возвращает false. Можете ли вы сказать мне, почему это происходит?

Ответы [ 2 ]

5 голосов
/ 23 сентября 2011

Что за хак!Почему бы не использовать стандартные функции чтения строк и файлов в C ++:

bool find_in_file(const std::string & needle)
{
  std::ifstream in("optab1.txt");
  std::string line;

  while (std::getline(in, line))  // remember this idiom!!
  {
    // if (line.substr(0, needle.length()) == needle)  // not so efficient
    if (line.length() >= needle.length() && std::equal(needle.begin(), needle.end(), line.begin())) // better
    // if (std::search(line.begin(), line.end(), needle.begin(), needle.end()) != line.end())  // for arbitrary position
    {
      return true;
    }
  }
  return false;
}

Вы можете заменить substr более продвинутыми функциями поиска строк, если строка поиска не обязательно должна находиться в начале строки.Версия substr является наиболее читаемой, но она создает копию подстроки.Версия equal сравнивает две строки на месте (но требует дополнительной проверки размера).Версия search находит подстроку где угодно, не только в начале строки (но по цене).

1 голос
/ 23 сентября 2011

Не совсем понятно, что вы пытаетесь сделать, но условие в while никогда не будет выполнено, если обычное char не подписано.(Обычно это не так, поэтому вам может это сойти с рук.) Кроме того, вы не извлекаете конец строки в цикле, так что вы, вероятно, увидите его вместо EOF и будете проходить слишком часто впетля.Я написал бы это по-другому:

bool
in1( std::string const& target )
{
    std::ifstream in( "optab1.txt" );
    if ( ! in.is_open() )
        //  Some sort of error handling, maybe an exception.
    std::string line;
    while ( std::getline( in, line )
            && ( line.size() < target.size() 
                 || ! std::equal( target.begin(), target.end(), line.begin() ) ) )
        ;
    return in;
}

Обратите внимание на проверку того, что открытие прошло успешно.Одна из возможных причин, по которой вы всегда возвращаете false, заключается в том, что вы не открываете файл успешно.(Но мы не можем знать, если вы не проверите статус после открытия.)

...