Войти

Показать полную графическую версию : [решено] Поиск в файле на примере телефонной книги


virus8
03-04-2012, 16:31
Всем привет!
Помогите, я хоть и понимаю, что глупый вопрос, но до меня не доходит.
Банально не могу понять как искать информацию в файле на жестком диске!!!(на примере телефонной книги).
вот код:

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


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

virus8
04-04-2012, 09:05
//делаете временную переменную 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
fin.getline(forsearch,80);

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

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

virus8
05-04-2012, 07:33
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
эта переменная сбивается после закрытия программы »
тоже ее куда-нибудь сохранять, сделать ini-файл или в реестр

virus8
05-04-2012, 12:37
Понятно спасибо! Еще пока еше не дошел не до ini-файла не до реестра! Буду дальше учить!
Спасибо большое за помощь.




© OSzone.net 2001-2012