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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение подстроки в строке, Нахождение подстроки в строке 
V
    Опции темы
ioManip
  Дата 2.5.2013, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



Код



#include <iostream>
#include <string.h>
#include <stdio.h>
#include <fstream>


using namespace std;

struct Car
{
    unsigned int number;        // номер
    char         model[50];     // марка
    char         surname[50];   // фамилия
    char         vecIns[50];    // тех. осмотр
};

int main()
{
    Car infoCar[100];
    int size;
    int i;
    int count = 0;
    string carFind; 
    
    ofstream file("BaseCar.dat"); // создаем файл с данными о машинах

    if (file == NULL)
        return 0;
    
    cout << "Введите количество машин: ";
    cin >> size;
    
    for (int i = 0; i < size; i++)
    {
       cout << "Введите номер автомобиля: ";
       file << "Номер автомобиля: ";
       cin >> infoCar[i].number;
       file << infoCar[i].number << endl;
       
       cout << "Введите марку автомобиля: ";
       file << "Марка автомобиля: "; 
       cin >> infoCar[i].model;
       file << infoCar[i].model << endl;
       
       cout << "Введите фамилию: ";
       file << "Фамилия: ";
       cin >> infoCar[i].surname;
       file << infoCar[i].surname << endl;
       
       cout << "Тех. осмотр[Yes/No]: ";
       file << "Тех. осмотр: ";
       cin >> infoCar[i].vecIns;
       file << infoCar[i].vecIns << endl;
       
       cout << endl;
    }

    cout << "Введите название машины, которую нужно найти: ";
    cin >> carFind;
    
    
    
    while ( !file.eof() )
    {
        file.open("BaseCar.dat", ofstream::in); 
        
        if ( strstr(carFind, infoCar[i].model) > 0 )
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }

    }
    
    file.close();
    
    cout << "Всего найдено автомобилей заданноей марки: " << count;
    return 0;
}


В 67 строке, я использую strstr, на что мне отвечают 
Код
 нет соответствующей функции для вызова «strstr(std::string&, char [50])»


Я может быть не правильно ее использую? Например параметры не те? 
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
fish9370
Дата 2.5.2013, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



Код

strstr(carFind->cstr(), infoCar[i].model)


вот так попробуй

Добавлено @ 09:38
а вобще в string операторы сравнения перегружены, ты можешь сравнивать без strstr() напрямую, думаю об этом тебе сейчас расскажут поподробнее..

Это сообщение отредактировал(а) fish9370 - 2.5.2013, 09:38


--------------------
undefined
PM MAIL WWW ICQ   Вверх
volatile
Дата 2.5.2013, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  2.5.2013,  03:30 Найти цитируемый пост)
Нахождение подстроки в строке 


В С++ это так обычно делаецца
Цитата(ioManip @  2.5.2013,  03:30 Найти цитируемый пост)
#include <string.h>
...
if ( strstr(carFind, infoCar[i].model) > 0 )
if (carFind.find (infoCar[i].model) != std::string::npos)


PM MAIL   Вверх
ioManip
Дата 5.5.2013, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



Так, с этим вроде ясно! Но почему тогда, происхожит зацикливание программы? А подсчета количества найденных машин вообще не происходит?
Код


#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>


using namespace std;

struct Car
{
    unsigned int number;        // номер
    char         model[50];     // марка
    char         surname[50];   // фамилия
    char         vecIns[50];    // тех. осмотр
};

int main()
{
    Car infoCar[100];
    int size;
    int i;
    int count = 0;
    string carFind; 
    
    ofstream file("BaseCar.dat"); // создаем файл с данными о машинах

    if (file == NULL)
        return 0;
    
    cout << "Введите количество машин: ";
    cin >> size;
    
    for (int i = 0; i < size; i++)
    {
       cout << "Введите номер автомобиля: ";
       file << "Номер автомобиля: ";
       cin >> infoCar[i].number;
       file << infoCar[i].number << endl;
       
       cout << "Введите марку автомобиля: ";
       file << "Марка автомобиля: "; 
       cin >> infoCar[i].model;
       file << infoCar[i].model << endl;
       
       cout << "Введите фамилию: ";
       file << "Фамилия: ";
       cin >> infoCar[i].surname;
       file << infoCar[i].surname << endl;
       
       cout << "Тех. осмотр[Yes/No]: ";
       file << "Тех. осмотр: ";
       cin >> infoCar[i].vecIns;
       file << infoCar[i].vecIns << endl;
       
       cout << endl;
    }

    cout << "Введите название машины, которую нужно найти: ";
    cin >> carFind;
    
    while ( !file.eof() )
    {
        file.open("BaseCar.dat", ofstream::in); 
        
        if ( carFind.find(infoCar[i].model) != string::npos)
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }

    }
    
    file.close();
    
    cout << "Всего найдено автомобилей заданноей марки: " << count;
    
    return 0;
}


Мне какжется я что то делаю не так, когдаработаю с файлами.
Смотрите:
ofstream - нужен для записи в файл
ifstream - для чтения из файл
Тогда может быть в 63 строке нужно написать вот это 
Код

ifstream in_file("BaseCar.dat")

Но так тоже не выходит.

P.S.  smile  smile 

Это сообщение отредактировал(а) ioManip - 5.5.2013, 06:50
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
baldina
Дата 5.5.2013, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  5.5.2013,  06:49 Найти цитируемый пост)
    while ( !file.eof() )
    {
        file.open("BaseCar.dat", ofstream::in); 

Код

    ifstream in_file("BaseCar.dat");
    while ( !in_file.eof() )
    {
 

Это сообщение отредактировал(а) baldina - 5.5.2013, 11:20
PM MAIL   Вверх
ioManip
Дата 5.5.2013, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



baldina,  Не - а!!! Все равно не ищет количество машин и зацикливание идет! У меня аура какая то наверное smile
Код

#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>


using namespace std;

struct Car
{
    unsigned int number;        // номер
    char         model[50];     // марка
    char         surname[50];   // фамилия
    char         vecIns[50];    // тех. осмотр
};

int main()
{
    Car infoCar[100];
    int size;
    int i;
    int count = 0;
    string carFind; 
    
    ofstream file("BaseCar.dat"); // создаем файл для записи данных о машинах

    if (file == NULL)
        return 0;
    
    cout << "Введите количество машин: ";
    cin >> size;
    
    cout << endl;
    
    for (int i = 0; i < size; i++)
    {
       cout << "Введите номер автомобиля: ";
       file << "Номер автомобиля: ";
       cin >> infoCar[i].number;
       file << infoCar[i].number << endl;
       
       cout << "Введите марку автомобиля: ";
       file << "Марка автомобиля: "; 
       cin >> infoCar[i].model;
       file << infoCar[i].model << endl;
       
       cout << "Введите фамилию: ";
       file << "Фамилия: ";
       cin >> infoCar[i].surname;
       file << infoCar[i].surname << endl;
       
       cout << "Тех. осмотр[Yes/No]: ";
       file << "Тех. осмотр: ";
       cin >> infoCar[i].vecIns;
       file << infoCar[i].vecIns << endl;
       
       cout << endl;
    }

    cout << "Введите название машины, которую нужно найти: ";
    cin >> carFind;
    
    ifstream in_file("BaseCar.dat"); // открываем файл для чтения
    
    while ( !in_file.eof() )
    {   
        if ( carFind.find(infoCar[i].model) != string::npos)
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }
    }
    
    in_file.close();
    file.close();
    
    cout << "Всего найдено автомобилей заданноей марки: " << count;
    
    return 0;
}

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
volatile
Дата 5.5.2013, 17:01 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  5.5.2013,  14:32 Найти цитируемый пост)
У меня аура какая то 

у вас не аура, у вас пустой цикл
Цитата(ioManip @  5.5.2013,  14:32 Найти цитируемый пост)
    while ( !in_file.eof() )
    {   
        if ( carFind.find(infoCar[i].model) != string::npos)
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }
    }

где здесь происходит чтение файла?  smile 
PM MAIL   Вверх
ioManip
Дата 6.5.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



volatile,  Если Вы имеете в виду вот это 
Код

 while ( !in_file.eof() )
    {   
        ifstream in_file("BaseCar.dat");    // Вот эта строчка !
        
        if ( carFind.find(infoCar[i].model) != string::npos )
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }
    }

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

Это сообщение отредактировал(а) ioManip - 6.5.2013, 11:24
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
baldina
Дата 6.5.2013, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



volatile имеет в виду, что внутри цикла у вас нет чтения файла.
должно быть что-то типа
Код

    ifstream in_file("BaseCar.dat"); // открываем файл для чтения
    
    while ( !in_file.eof() )
    {   
        // read file

       in_file >> infoCar[i].number;
       in_file >> infoCar[i].model;
       in_file >> infoCar[i].surname;
       in_file >> infoCar[i].vecIns;

        if ( carFind.find(infoCar[i].model) != string::npos)
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }
    }


Добавлено через 4 минуты и 9 секунд
кстати, i в цикле не меняется. либо сделать i++ в конце, либо использовать один объект 
Код

       Car car;
       in_file >> car.number;
       in_file >> car.model;
       in_file >> car.surname;
       in_file >> car.vecIns;
        if ( carFind.find(car.model) != string::npos)
        {
            count++;
            cout << "Марка: " << car.model << "Номер: " 
       ...


Это сообщение отредактировал(а) baldina - 6.5.2013, 11:30
PM MAIL   Вверх
ioManip
Дата 6.5.2013, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



baldina, я Вас правильно понял?
Код

ifstream in_file("BaseCar.dat");
     
    while ( !in_file.eof() )
    { 
        in_file >> infoCar[i].model;
        in_file >> infoCar[i].number;
        in_file >> infoCar[i].surname;
        in_file >> infoCar[i].vecIns;
        
        if ( carFind.find(infoCar[i].model) != string::npos )
        {
            count++;
            cout << "Марка: " << infoCar[i].model << "Номер: " 
                              << infoCar[i].number << "Владелец: " << infoCar[i].surname << endl;
        }
        
        i++;
    }


Оххх....думайте обо мне что хотите, но этот вариант тоже не работает, т.е. несколько раз подряд выдает МаркаНомерВладелец + еще какие то цыфры...
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
baldina
Дата 6.5.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



я не все написал, а упрощенно. у вас в файле строки будут начинаться с 
"Номер автомобиля: ", "Фамилия: " и т.д., их тоже надо читать и пропускать.
PM MAIL   Вверх
ioManip
Дата 11.5.2013, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



Сейчас вроде, все верно, за 1 исключением!

Машины выдает верно, но выдает найденную машину + 1, т.е. как будто мусор какойто берет.
Пример
Код

Марка: toyota
Номер: 478
Владелец: kol

Марка: 
Номер: 0
Владелец: 

Количество найденных машин: 2


Код

int main()
{
    Car infoCar[100];
    int size;
    int i;
    int count = 0;
    string carFind; 
    
    ofstream out_file("BaseCar.dat"); // создаем файл для записи данных о машинах

    if (out_file == NULL)
        return 0;
    
    cout << "Введите количество машин: ";
    cin >> size;
    
    cout << endl;
    
    for (i = 0; i < size; i++)
    {
       cout << "Введите номер автомобиля: ";
       cin >> infoCar[i].number;
       out_file << infoCar[i].number << endl;
       
       cout << "Введите марку автомобиля: ";
       cin >> infoCar[i].model;
       out_file << infoCar[i].model << endl;
       
       cout << "Введите фамилию: ";
       cin >> infoCar[i].surname;
       out_file << infoCar[i].surname << endl;
       
       cout << "Тех. осмотр[Yes/No]: ";
       cin >> infoCar[i].vecIns;
       out_file << infoCar[i].vecIns << endl;
       
       cout << endl;
    }

    cout << "Введите название машины, которую нужно найти: ";
    cin >> carFind;
    
    cout << endl;
    
    ifstream in_file("BaseCar.dat");
     
    while ( !in_file.eof() )
    {  
        in_file >> infoCar[i].number;
        in_file >> infoCar[i].model;
        in_file >> infoCar[i].surname;
        in_file >> infoCar[i].vecIns;
        
        if ( carFind.find(infoCar[i].model) != string::npos )
        {
            cout << "Марка: "    << infoCar[i].model << endl 
                 << "Номер: "    << infoCar[i].number << endl 
                 << "Владелец: " << infoCar[i].surname << endl;
            cout << endl;
            
            count++;
        }
        
        i++;
    }
    
    out_file.close();
    in_file.close();
    
    if ( count > 0 )
         cout << "Количество найденных машин: " << count;
    else
         cout << "Машин не найдено!" << endl;
    
    return 0;
}



Почему так может быть ?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
volatile
Дата 11.5.2013, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ioManip @  11.5.2013,  09:20 Найти цитируемый пост)
   while ( !in_file.eof() 42)
    {  
        in_file >> infoCar[i].number;
        in_file >> infoCar[i].model;
        in_file >> infoCar[i].surname;
        in_file >> infoCar[i].vecIns;
        if (!in_file.good()) 
           break;

        ...
        


PM MAIL   Вверх
ioManip
Дата 12.5.2013, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

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



Фуууух...ну вроде все! Всем большое спасибо!  smile 

P.S.  
Код

in_file.good()
 если честно, сначала подумал, что это шутка   smile  
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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