Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с программой 
V
    Опции темы
Сашок
Дата 10.2.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



  Прога определяет есть ли заданное слово в словаре.  Всё корректно работает до тех пор пока не доходим до конца файла. Например, введем при вызове функции неверное слово, тогда произойдет просмотр всего файла и по признаку его конца сообщится что слова нет в словаре и далее при вызове хоть с верным словом, хоть с неверным, будет результат что слово отсутствует.
  Я дебагером походил и вроде проблема в том, что если в какой то момент был достигнут конец файла, то seekg() не возвращяет указатель считывания на начало файла и поэтому  возвращается false в функции in_slovar(), тк мы находимся в конце файла. Если кто сможет разьяснить в чем дело буду благодарен.

Код

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

class slovar
{
      ifstream mystream;
public:
       slovar(){ mystream.open("c:\slovar.txt"); if (!mystream) cout << "Can't open file!"; }
       ~slovar(){  mystream.close(); }
       
       bool equal( char str[80], char temp[80] );
       bool in_slovar( char temp[80] );
};


int main(){
    slovar slovo;
    
    char temp[80];
    
    strcpy(temp,"аба");
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    strcpy(temp,"ящурный");
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    strcpy(temp,"вода");
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    strcpy(temp,"год");
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    strcpy(temp,"дом");
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    strcpy(temp,"слон");
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
}


// Проверка совпадения двух слов.
bool slovar::equal(char str[80], char temp[80])
{
     int i = 0;
     while ( str[i]!=0 ){
           if (str[i] != temp[i]) return false;
           i++;
     }
     
     if (str[i] != temp[i]) return false;
     
     return true;
}

// Поиск в солваре.
bool slovar::in_slovar( char temp[80] )
{
     mystream.seekg( 0, ios::beg );
     char str[80];
     for(;;){
                mystream >> str;
                if ( equal(str,temp) ) return true;
                if ( mystream.eof() ) return false;
     }
}

PM MAIL   Вверх
andrew_121
Дата 10.2.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Сашок, Нужно вот так:
Код

// Поиск в солваре.
bool slovar::in_slovar( char temp[80] )
{
     mystream.seekg( 0, ios::beg );
     char str[80];
     while ( mystream.good() ) {
                mystream >> str;
                if ( equal(str,temp) ) return true;
     }
     return false;
}

И еще. Ты пишешь на С++, почему такие декларации?
Код

bool equal( char str[80], char temp[80] );
bool in_slovar( char temp[80] );

Так лучше:
Код

bool equal( const string& str, const string& temp );
bool in_slovar( const string& temp );


И это:
Код

bool slovar::equal(char str[80], char temp[80])
{
     int i = 0;
     while ( str[i]!=0 ){
           if (str[i] != temp[i]) return false;
           i++;
     }
     
     if (str[i] != temp[i]) return false;
     
     return true;
}

Перепиши вот так:
Код

bool slovar::equal(string str, string temp)
{
      return str == temp;
}


Это сообщение отредактировал(а) andrew_121 - 11.2.2009, 09:35


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Сашок
Дата 10.2.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



string это хорошо, но это не главное. Я переписал но оно по прежнему не работает.

Код

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

class slovar
{
      ifstream mystream;
public:
       slovar(){mystream.open("c:\slovar.txt"); if (!mystream) cout << "Can't open file";}
       ~slovar(){ mystream.close(); }
       bool in_slovar( string temp );
};

int main(){
    string temp;
    slovar slovo;
     
    temp="аба";
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    temp="ящи";
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    temp="вода";
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    temp="год";
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    temp="дом";
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
    temp="слон";
    if ( slovo.in_slovar(temp) ) cout<< "Yes!\n\n"; else cout << "No!\n\n";
    
}

// Поиск в словаре, если есть то true.
bool slovar::in_slovar( string temp )
{
     mystream.seekg( 0, ios::beg ); 
     
     string str;
     while( !mystream.eof() ){
                mystream >> str;
                if ( str == temp ) return true;
     }
     return false;
}



После запроса слова "ящи", которого нет в словаре, все дальнейшие вызовы так же оказываются false.  А чем моя функция от новой отличается не очень понял.

Это сообщение отредактировал(а) Сашок - 11.2.2009, 00:18
PM MAIL   Вверх
andrew_121
Дата 11.2.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Сашок @  10.2.2009,  23:45 Найти цитируемый пост)
После запроса слова "ящи", которого нет в словаре, все дальнейшие вызовы так же оказываются false.

Естественно! Нужно по условию (слова нет) перепозиционировать файл на начало.
Цитата(Сашок @  10.2.2009,  23:45 Найти цитируемый пост)
А чем моя функция от новой отличается не очень понял.

Тем, что тут сначала проверяется условие, а затем выполняется действие.

Это сообщение отредактировал(а) andrew_121 - 11.2.2009, 09:37


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Сашок
Дата 11.2.2009, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



А разьве перепозиционированием не занимается функция seekg() ?
Если нет то как это сделать?

Про отличие я ступил, верно говорите. Хотя если файл не пуст то сойдут оба варианта( а он не пуст).

Это сообщение отредактировал(а) Сашок - 11.2.2009, 00:39
PM MAIL   Вверх
andrew_121
Дата 11.2.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Сашок @  11.2.2009,  00:33 Найти цитируемый пост)
А разьве перепозиционированием не занимается функция seekg() ?

Вот тут уже я ступил ))) Пора спатки...день был тяжелый... smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 11.2.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Сашок @  11.2.2009,  00:33 Найти цитируемый пост)
Хотя если файл не пуст то сойдут оба варианта( а он не пуст).

Не верно.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
xvr
Дата 11.2.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Когда файл дочитывается до конца у него выставляется флаг eof, который нужно сбрасывать вручную (см метод clear), иначе все функции работы с файлом (включая seekg) будут ломаться

PM MAIL   Вверх
Сашок
Дата 11.2.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



xvr, спасибо! Я думал что он автоматом сбрасывается. Теперь всё работает  smile 




andrew_121, работают верно оба варианта цикла, я проверил)



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0763 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.