Форум программистов, компьютерный форум CyberForum.ru

Поиск слова в файле, с файла в переменные - C++

Войти
Регистрация
Восстановить пароль
 
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
13.03.2013, 18:13     Поиск слова в файле, с файла в переменные #1
Доброго времени суток форумчанен!
Недавно написал код который ищет введенное пользователем слово в файле и если не находит его, то добавляет в конец файла. Несколько модернизировав код у меня вышло что нужно добавлять и некоторые переменные к слову, например:
C++
1
out << word_fn << "\t\t" << word.a << "\t" << word.b << "\t" << word.c << "\t" << word.d << "\n";
Переменные изначально задаются некоторому классу:
C++
1
2
3
4
5
6
class object
{
public:
    string name;
    int a, b, c, d;
};
То есть, сначала прога спрашивает слово и переменные, потом ищет слово в файле, если не находит, то добавляет слово и переменные.
Вот тут и появилась проблема... Вторая сторона проги. Первая добавляет, вторая извлекает.
Как теперь из файла достать данные и применить к классу.
Данные в таблице:
птица 1 1 0 1
самолет 1 1 1 0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
using namespace std;
 
class object
{
public:
    string name;
    int a, b, c, d;
};
 
int word ()
{
    setlocale (0, "1251");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string word_in, file_in = "base.txt";
    ifstream in (file_in.c_str (), ios::in);
    ofstream out (file_in, ios::out | ios::app);
    object word;
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    cout << "Введите слово: ";
    cin >> word.name;
    cin >> word.a;
    cin >> word.b;
    cin >> word.c;
    cin >> word.d;
    while (in >> word_in)
        if (word_in == word.name)
        {
            cout << "Слово '" << word_in << "' найдено.\n";
            in.close ();
            return 0;
        }
        if (word_in != word.name)
        {
            cout << "Слово '" << word.name << "' не найдено\n";
            out << word.name << "\t\t" << word.a << "\t" << word.b << "\t" << word.c << "\t" << word.d << "\n";
            cout << "Новое слово '" << word.name << "' добавлено\n";
            in.close ();
            return 0;
        }
    return 0;
}
Взять данные из строки файла, желательно из обоих строк и ждать ввода пользователем совпадений, сравнить и вывести word.name объекта.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2013, 18:13     Поиск слова в файле, с файла в переменные
Посмотрите здесь:

Поиск слова в файле C++
Поиск слова в текстовом файле C++
Поиск слова в файле C++
Поиск самого длинного слова в файле C++
C++ Поиск слова в файле
C++ Поиск слова в файле
C++ Поиск слова в файле
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.03.2013, 18:45     Поиск слова в файле, с файла в переменные #2
Нужно проверять на совпадение и слово и переменные?

Добавлено через 5 минут
Сделайте в классе перегрузку операторов чтения/записи, сравнения на равенство. Потом создаёте объект, заполняете поля. Потом читаете во временный объект объект из файла, сравниваете с созданным и т.д.
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
13.03.2013, 18:52  [ТС]     Поиск слова в файле, с файла в переменные #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Нужно проверять на совпадение и слово и переменные?

Добавлено через 5 минут
Сделайте в классе перегрузку операторов чтения/записи, сравнения на равенство. Потом создаёте объект, заполняете поля. Потом читаете во временный объект объект из файла, сравниваете с созданным и т.д.
Я пока вот чего наделал
Пользователь вносит данные 1 1 0 1, они записываются в переменные, а переменные в массив.
Затем код берет первую строку из файла (как в моем примере) и вносит данные в массив, сравнивает массивы, и тут нужно организовать цикл, что бы он взял вторую строку и тоже сравнил её с пользовательскими данными.
Затем третью и т.д, пока строки не закончатся.
Если найдет совпадение массива, то выдает первую переменную из массива (в которой должно храниться имя объекта.
Вот собственно что нужно...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
#include "opr.h"
using namespace std;
 
class object
{
public:
    string name;
    int a, b, c, d;
};
 
int file_word ()
{
    setlocale (0, "1251");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string file_in = "base.txt";
    ifstream in (file_in);
    object word_file;
    object word_in;
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    in >> word_file.name;
    in >> word_file.a;
    in >> word_file.b;
    in >> word_file.c;
    in >> word_file.d;
    cout << word_file.name << word_file.a << word_file.b << word_file.c << word_file.d;
    int m_word [4] = {word_file.a, word_file.b, word_file.c, word_file.d};
    cout << "Введите: ";
    cin >> word_in.a;
    cin >> word_in.b;
    cin >> word_in.c;
    cin >> word_in.d;
    int m_word_in [4] = {word_in.a, word_in.b, word_in.c, word_in.d};
    if (m_word == m_word_in)
    {
        cout << "Слово '" << word_file.name << "' найдено.\n";
        in.close ();
        return 0;
    }
    if (m_word != m_word_in)
    {
        word ();
        return 0;
    }
    return 0;
}
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.03.2013, 18:57     Поиск слова в файле, с файла в переменные #4
Цитата Сообщение от Leningradeс Посмотреть сообщение
Вот собственно что нужно...
Что нужно не понятно...
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
13.03.2013, 19:24  [ТС]     Поиск слова в файле, с файла в переменные #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Что нужно не понятно...
Нужно что бы:
пользователь ввел 1 1 0 1;
собрался массив пользователя = {1, 1, 0, 1};
из файла взялась строка птица 1 1 0 1;
собрался массив файла = {1, 1, 0, 1};
сравнить массивы;
(массив пользователя == массив файла);
и получить ответ << птица же;

а так как в файле еще и самолет 1 1 1 0;
собрать 2 массив файла = {1, 1, 1, 0};
взять и еще и сравнить;
с массивом пользователя = {1, 1, 0, 1};
(массив пользователя == массив файла);
и получить ответ << не самолет, нет;

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
#include "opr.h"
using namespace std;
 
class object
{
public:
    string name;
    int a, b, c, d;
};
 
int file_word ()
{
    setlocale (0, "1251");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string file_in = "base.txt";
    ifstream in (file_in);
    object word_file;
    object word_in;
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    in >> word_file.name;
    in >> word_file.a;
    in >> word_file.b;
    in >> word_file.c;
    in >> word_file.d;
    cout << word_file.name << word_file.a << word_file.b << word_file.c << word_file.d << "\n";
    int m_word [4] = {word_file.a, word_file.b, word_file.c, word_file.d};
    cout << m_word [0] << m_word [1] << m_word [2] << m_word [3] << "\n";
    cout << "Введите: ";
    cin >> word_in.a;
    cin >> word_in.b;
    cin >> word_in.c;
    cin >> word_in.d;
    int m_word_in [4] = {word_in.a, word_in.b, word_in.c, word_in.d};
    cout << m_word_in [0] << m_word_in [1] << m_word_in [2] << m_word_in [3] << "\n";
    if (m_word [4] == m_word_in [4])
    {
        cout << "Это '" << word_file.name << "'.\n";
        in.close ();
        return 0;
    }
    if (m_word != m_word_in)
    {
        cout << "Моя не понимай что это.\n";
        in.close ();
        return 0;
    }
    in.close ();
    return 0;
}
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.03.2013, 19:27     Поиск слова в файле, с файла в переменные #6
Вопрос остался... Цель какя? Опишите. Если в фале 1000 записей, будете 1000 массивов создавать?

Добавлено через 3 минуты
Нужно работать с классами, как с встроенными данными. Представьте, что у вас в файле записаны данные типа int. Пользоватьель вводит некое значение int. Задача: проверить существует ли в файле такое значение, если нет, то добавить это значение в конец файла. Вы этого хотите, но только с объектами класса? Я правильно понял?
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
13.03.2013, 19:49  [ТС]     Поиск слова в файле, с файла в переменные #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Вопрос остался... Цель какя? Опишите. Если в фале 1000 записей, будете 1000 массивов создавать?

Добавлено через 3 минуты
Нужно работать с классами, как с встроенными данными. Представьте, что у вас в файле записаны данные типа int. Пользоватьель вводит некое значение int. Задача: проверить существует ли в файле такое значение, если нет, то добавить это значение в конец файла. Вы этого хотите, но только с объектами класса? Я правильно понял?
Все правильно. Да проверить файл на присутствие значения, если есть то выдать ответ, если нет, то добавить в конец файла.
Собственно первая часть (функция) добавляет, но производит поиск только по слову (параметры не смотрит, хотя было бы не плохо если параметры захватывались бы в массив).
Вторая часть (функция), должна производить поиск по параметрам и захватывать слово перед ними. Затем сравнивать со значением пользователя и печатать слово.
Мне в принципе без разницы с чем будет код, хоть классы, хоть массивы, лишь бы правильно работал и был бы более менее практичен.

Добавлено через 14 минут
В цикле я думаю будет не проблема создать 1000 массивов, но только как эти массивы заполнить правильно из каждой строки.
Ведь можно что то такое сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (!infile.eof ())
{
    in >> word_file.name;
    in >> word_file.a;
    in >> word_file.b;
    in >> word_file.c;
    in >> word_file.d;
    int m_word [4] = {word_file.a, word_file.b, word_file.c, word_file.d};
    if (m_word [4] == m_word_in [4])
    {
        cout << "Это '" << word_file.name << "'.\n";
        in.close ();
        return 0;
    }
}
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.03.2013, 19:56     Поиск слова в файле, с файла в переменные #8
Цитата Сообщение от Leningradeс Посмотреть сообщение
Мне в принципе без разницы с чем будет код, хоть классы, хоть массивы, лишь бы правильно работал и был бы более менее практичен.
Если делать правильно и красиво, то всё через класс. Переопределяете в нём нужные операторы (чтения, записи, сравнения и т.д.). В них прописываете всё что хотите делать, и как хотите делать. После этого, многие вопросы отпадут сами собой. Работаете с содержимым файла (объекты класса), как с обычными данными (поиск, сортировка, замена, добавление, удаление и т.п.).

Добавлено через 1 минуту
Переопределять операторы в классе умеете?
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
13.03.2013, 21:23  [ТС]     Поиск слова в файле, с файла в переменные #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Если делать правильно и красиво, то всё через класс. Переопределяете в нём нужные операторы (чтения, записи, сравнения и т.д.). В них прописываете всё что хотите делать, и как хотите делать. После этого, многие вопросы отпадут сами собой. Работаете с содержимым файла (объекты класса), как с обычными данными (поиск, сортировка, замена, добавление, удаление и т.п.).

Добавлено через 1 минуту
Переопределять операторы в классе умеете?
То есть сравнивать классы, а не париться с массивами?
Не умею.

Нужен метод? Окай, пока пробую добавить метод.

Добавлено через 21 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ifstream in (file_in);
    object file;
    object user;
    in >> file.name;
    in >> file.a;
    in >> file.b;
    in >> file.c;
    in >> file.d;
    cout << file.name << file.a << file.b << file.c << file.d << "\n";
    cout << "Введите: ";
    cin >> user.a;
    cin >> user.b;
    cin >> user.c;
    cin >> user.d;
    if (file.a == user.a) if (file.b == user.b) if (file.c == user.c) if (file.d == user.d)
        cout << file.name;
С помощью хитрейшей манипуляции я получил желаемое, но пока не основательно, хотя бы избавился от массивов. Вот.
Теперь надо как то все это поместить в цикл и задать ему загрузку данных из файла для класса. Ну и соответственно сравнение этих классов.

Добавлено через 42 минуты
Последнее что сделал... не могу разобрать с методами, а так почти работает и цикл вроде "работает".

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
#include "opr.h"
using namespace std;
 
//int equale (int a, int b, int c, int d);
 
class object
{
public:
    string name;
    int a, b, c, d;
};
 
int file_word ()
{
    setlocale (0, "1251");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string file_in = "base.txt";
    ifstream in (file_in);
    object file;
    object user;
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    cout << "Введите: ";
    cin >> user.a;
    cin >> user.b;
    cin >> user.c;
    cin >> user.d;
    while (!in.eof ())
    {
        in >> file.name;
        in >> file.a;
        in >> file.b;
        in >> file.c;
        in >> file.d;
        if (file.a == user.a) if (file.b == user.b) if (file.c == user.c) if (file.d == user.d)
            cout << file.name;
        else
            cout << "Шо це таке?";
    }
    in.close ();
    return 0;
}
 
/*
int equale (object a, object b)
{
    int func;
    if (a.a == b.a) if (a.b == a.b) if (a.c == b.c) if (a.d == b.d)
    {
        func = 1;
        return func;
    }
    else
    {
        func = 0;
        return func;
    }
}
*/
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.03.2013, 21:29     Поиск слова в файле, с файла в переменные #10
Если в main() делать, то как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
using namespace std;
 
class object
{
    string name;
    int a, b, c, d;
 
public:
    object(string str, int x, int y, int z, int w)
    { name = str; a = x; b = y; c = z; d = w; }
    
    object() : name(""), a(0), b(0), c(0), d(0)
    {}
    
    string getname() { return name;}
 
    // чтение из файла
    friend ifstream& operator>>(ifstream& in, object& word)
    {
        in >> word.name >> word.a 
           >> word.b    >> word.c >> word.d;
        return in;
    } 
    
    // запись в файл
    friend ofstream& operator<<(ofstream& out, const object& word)
    {
        out << word.name << ' ' << word.a << ' '
            << word.b    << ' ' << word.c << ' ' <<  word.d << endl;
        return out;
    }
    
    //сравнение на равенство
    bool operator==(const object& word)
    {
        if (name == word.name && a == word.a && 
               b == word.b    && c == word.c && d == word.d)
        return true;
        else return false;
    } 
};
 
int main()
{
    setlocale (0, "1251");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    string file_in = "base.txt";
    
    ifstream fin(file_in);
    
    if (!fin.good ()) clog << "Файл не найден.\n";
    else
    {
        string str;
        int a, b, c, d;
    
        cout << "Введите слово: ";
        cin >> str;
        cin >> a;
        cin >> b;
        cin >> c;
        cin >> d;
    
        object word(str, a, b, c, d);
        
        while (true)
        {
            object word_in;
        
            fin >> word_in;
        
            if (fin.eof()) break;
        
            if (word_in == word)
            {
                    cout << "Слово '" << word.getname() << "' найдено.\n";
                    fin.close();
                    break;
            }
        }
    
        if (fin.eof())
        {
            cout << "Слово '" << word.getname() << "' не найдено\n";
            fin.close();
            ofstream fout(file_in, ios::out | ios::app);
            fout << word;
            cout << "Новое слово '" << word.getname() << "' добавлено\n";
            fout.close ();
        }
    }
    
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 21:40     Поиск слова в файле, с файла в переменные
Еще ссылки по теме:

С++ поиск слова в файле C++
Поиск самого длинного слова в файле C++
C++ Считать слова из файла в разные переменные
C++ Поиск чисел в файле, и занесение их в переменные
C++ Поиск слова в файле

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
13.03.2013, 21:40  [ТС]     Поиск слова в файле, с файла в переменные #11
Вот это вообще клево! Супер код, спасибо большое. Вообще веду к разработке для курсовика подобия ЭС (экспертной системы).
Yandex
Объявления
13.03.2013, 21:40     Поиск слова в файле, с файла в переменные
Ответ Создать тему
Опции темы

Текущее время: 22:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru