Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Поиск в файле на примере телефонной книги (http://forum.oszone.net/showthread.php?t=231971)

virus8 03-04-2012 16:31 1892665

Поиск в файле на примере телефонной книги
 
Всем привет!
Помогите, я хоть и понимаю, что глупый вопрос, но до меня не доходит.
Банально не могу понять как искать информацию в файле на жестком диске!!!(на примере телефонной книги).
вот код:
читать дальше »
Код:

файл kniga.h

#ifndef KNIGA_H
#define KNIGA_H


class Tkniga
{
        static int num;
        char name[80];
        long phone;
        char addres[80];
public:
        Tkniga();
        void Print() const;
        void Add();
        //void Delete(Tkniga f);
        void Search();
};

#endif

файл opis.cpp

#include "kniga.h"
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int Tkniga::num = 0;

Tkniga::Tkniga()
{
        strcpy(name, "None");
        phone = 0;
        strcpy(addres, "None");
}

void Tkniga::Print()const
{
        ifstream fin("database.txt", ios_base::in);
        char ch;
        while(fin.get(ch) )
                cout << ch;
        /*cout << "Name: " << name << endl
                << "Addres: " << addres << endl
                << "Phone: " << phone << endl;*/
}

void Tkniga::Add()
{
        num++;
       
        ofstream fout("database.txt", ios_base::out|ios_base::app);
        cout << "Enter name: ";
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.getline(name, 80);
        cout << "Enter addres: ";
        cin.getline(addres, 80);
        cout << "Enter phone: ";
        cin >> phone;
        fout << num << ": " << "name: " << name << "; Addres: " << addres << "; Phone: " << phone << endl;
}

void Tkniga::Search()            // ------ вот тут траблы не могу вьехать как передать файл для поиска
{
        ifstream fin("database.txt", ios_base::in);
        cout << "enter name: ";
        char Name[80];
        cin.getline(Name, 80);
        strcmp(fin
}

файл usekniga.cpp

#include "kniga.h"
#include <iostream>
using namespace std;

int main()
{
        Tkniga abon;
       
        char ch;
        do
        {
                cout << "Menu\n";
                cout << "1) Dlya vvoda abonenta\n"
                        << "2) Dlya prosmotra vsex abonentov\n";
                cin >> ch;
        }while(ch != '1' && ch != '2');

        if(ch == '1')
        {
                abon.Add();
        }

        if(ch == '2')
        {
                abon.Print();
        }
        return 0;
}



П.С. - если кто знает где про это почитать и подскажет то буду очень признателен!!!

ferget 03-04-2012 17:37 1892714

Код:

        //делаете временную переменную
        char forsearch[80];
        //считываете файл построчно
        while(!(file.eof()))
        {
                getline(fin, forsearch);
                //здесь сравниваете forsearch и Name
        }

Литература
Кочан С. - Программирование на языке С - 2007, Глава 10

virus8 04-04-2012 09:05 1893078

Цитата:

Цитата ferget
//делаете временную переменную char forsearch[80]; //считываете файл построчно while(!(file.eof())) { getline(fin, forsearch); //здесь сравниваете forsearch и Name } »

такой вопрос - у меня компилятор ругается на getline(fin, forsearch); - говорит (getline) - идентификатор не определён, что это???

делаю вот так -
читать дальше »
Код:

void Tkniga::Search()            //
{
        ifstream fin("database.txt", ios_base::in);
        cout << "enter name: ";
        char Name[80];
        cin.getline(Name, 80);
        //делаете временную переменную
        char forsearch[80];
        //считываете файл построчно
        while(!fin.eof())
        {
                getline(fin, forsearch);                      //------        идентификатор не определён, что это???
                //здесь сравниваете forsearch и Name
                if(!(strcmp(forsearch, Name)
                {
                        cout << forsearch;
                }
        }
}


ferget 04-04-2012 10:44 1893129

Код:

fin.getline(forsearch,80);

virus8 04-04-2012 15:45 1893357

Спасибо большое, до этого сам дошел!!(интернета не было глянуть)) )
Сейчас сижу мыслю - программа не выводит найденное!!!

ferget 04-04-2012 16:29 1893388

Цитата:

Цитата virus8
программа не выводит найденное »

тут два варианта:
во-первых - должны совпадать кодировки, в консоли вводится 866 и файл должен быть 866
во-вторых - strcmp работает только если две строки абсолютно одинаковые, регистры букв тоже должны быть одинаковые. то есть, надо сначала разбить строку на слова и каждое сравнить, посмотрите функцию strtok, например.

virus8 05-04-2012 07:33 1893757

Ferget спасибо большое за помощь разобрался ))))
Только сделал поиск через strstr!!!
кому нужно код:

читать дальше »
Код:

файл kniga.h

#ifndef KNIGA_H
#define KNIGA_H


class Tkniga
{
        static int num;
        char name[80];
        long phone;
        char addres[80];
        char file[20];
public:
        Tkniga();
        void Print() const;
        void Add();
        //void Delete(Tkniga f);
        void Search();
};

#endif

файл opis.cpp

#include "kniga.h"
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int Tkniga::num = 0;

Tkniga::Tkniga()
{
        strcpy(name, "None");
        phone = 0;
        strcpy(addres, "None");
}

void Tkniga::Print()const
{
        ifstream fin("database.txt", ios_base::in);
        char ch;
        while(fin.get(ch) )
                cout << ch;
        /*cout << "Name: " << name << endl
                << "Addres: " << addres << endl
                << "Phone: " << phone << endl;*/
}

void Tkniga::Add()
{
        num++;
       
        ofstream fout("database.txt", ios_base::out|ios_base::app);
        cout << "Enter name: ";
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.getline(name, 80);
        cout << "Enter addres: ";
        cin.getline(addres, 80);
        cout << "Enter phone: ";
        cin >> phone;
        fout << num << ": " << "name: " << name << "; Addres: " << addres << "; Phone: " << phone << endl;
}

void Tkniga::Search()            // ------ вот тут траблы не могу вьехать как передать файл для поиска
{
        ifstream fin("database.txt", ios_base::in);
        cout << "enter name: ";
        char Name[80];
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cin.getline(Name, 80);
        //делаете временную переменную
        char forsearch[80];
        //считываете файл построчно
        while(!fin.eof())
        {
                fin.getline(forsearch,80);
                //здесь сравниваете forsearch и Name
                if(strstr(forsearch, Name) != NULL)
                {
                        cout << forsearch << endl;
                }
        }
}

файл usekniga.cpp

#include "kniga.h"
#include <iostream>
using namespace std;

int main()
{
        Tkniga abon;
       
        char ch;
        do
        {
                cout << "Menu\n";
                cout << "1) Dlya vvoda abonenta\n"
                        << "2) Dlya prosmotra vsex abonentov\n"
                        << "3) Dlya poiska po imeni\n";
                cin >> ch;
        }while(ch != '1' && ch != '2' && ch != '3');

        if(ch == '1')
        {
                abon.Add();
        }

        if(ch == '2')
        {
                abon.Print();
        }

        if(ch == '3')
                abon.Search();
        return 0;
}



И такой ещё вопрос у меня в классе реализована статическая переменная num она при работе программы добавляет число в новую строку. Вопрос в том, что эта переменная сбивается после закрытия программы и начинает всё с единицы писать. Можно ли сделать так, чтоб она считывала последний результат? Допустим последний абонент номер 5 и при добавлении она пишет уже 6 абонент.

ferget 05-04-2012 11:53 1893840

Цитата:

Цитата virus8
эта переменная сбивается после закрытия программы »

тоже ее куда-нибудь сохранять, сделать ini-файл или в реестр

virus8 05-04-2012 12:37 1893881

Понятно спасибо! Еще пока еше не дошел не до ini-файла не до реестра! Буду дальше учить!
Спасибо большое за помощь.


Время: 17:12.

Время: 17:12.
© OSzone.net 2001-