Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск из txt С++

11K
27 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Есть файл data.txt содержащий определенные данные по принципу :

Komtek sistone China 25000 5 4 200000 130 1112301596
(имя1) (имя2) (имя3) (цена1) (количество1) (количество2) (имя4) (количество3) (дата)

и требуется произвести поиск сначало по имя3
Код:
cout<<"Vvedite parametr poiska"<<endl;
    cin >> name3;
    outFile<<"\t"<<name3<<"\n";

    for (i=0; i<n; i++)
    {if(strcmp (Dan.fio, name3) == 0) //  сравнение строк
        {Output(Dan);
          k+=1;
        outFile<<Dan.name1<<" "<<Dan.name2<<" "<<Dan.name3<<"  "<<Dan.price1<<"  "<<Dan.text1<<"\n";}  
    }
    if (k==0)
    {cout << "Po vashemu zaprosy nichego ne najdeno";
    outFile<<"Po vashemu zaprosy nichego ne najdeno\n";}

    cout<<endl<<endl;


Подскажите пожалуйста будет ли верна данная функция поиска и помогите пожалуйста организовать второй поиск по дате. Буду очень признателен.
2.0K
27 октября 2007 года
BroKeR
163 / / 04.05.2006
STL использовать можно???
2.0K
27 октября 2007 года
BroKeR
163 / / 04.05.2006
Протестил,все работает,пара замечаний.Строчки должны идти подряд.Разделитель между параметрами-пробел.Но функционал работает.Дальше сам наращивай.
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
#include <conio.h>

using namespace std;

vector <int> Search()
{
    vector <int> vec;

    for(int i=0;i<120;i++)
        vec.push_back(i);
    return vec;
}
vector <string> Split(const string& str)
{
    vector <string> ret;
    typedef string::size_type string_size;
    string_size i=0;

    while (i != str.size())
    {
        while (i != str.size() && isspace(str)) ++i;
        string_size j = i;
        while (j != str.size() && !isspace(str[j])) ++j;

        if (i != j)
        {
            ret.push_back(str.substr(i,j - i));
            i = j;
        }
    }
    return ret;
}
string SearchStrFor3Par(const string& str,size_t par)
{
    ifstream inFile("test.txt");

    if (inFile.fail())
    {
        cerr<<"Error!!! Don't read file!!!"<<endl;
        exit(1);
    }
    string tmpstr;

    while (!inFile.eof())
    {
        getline(inFile,tmpstr);
        vector <string> checkstr = Split(tmpstr);
        if (checkstr[par] == str) return tmpstr;
    }
    return tmpstr="Poisk rezultata ne dal...";
}

int main()
{
    string str;
    string search_str;
    size_t par;

    cout<<"Please input search str >";
    cin>>str;
    cout<<"Please input parametr >";
    cin>>par;

    search_str = SearchStrFor3Par(str,par);

    cout<<"-------------------------------------------"<<endl;
    cout<<"*******************************************"<<endl;
    cout<<"****"<<search_str<<endl;
    cout<<"*******************************************"<<endl;
    cout<<"-------------------------------------------"<<endl;

    getch();
    return 0;
}
11K
28 октября 2007 года
mitrof4nov
68 / / 10.09.2007
search str - исходный файл?
input parametr - необходимая дата?

Но если так, поск не работает :(
2.0K
28 октября 2007 года
BroKeR
163 / / 04.05.2006
 
Код:
ifstream inFile("test.txt");
поиск происходит в файле test.txt
 
Код:
string SearchStrFor3Par(const string& str,size_t par)
функция принимает параметр поиска-строку и номер параметра.Поиск происходит в файле test.txt.Возвращает строку содержащую параметр поиска.
11K
29 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Я хотел таким способом, но не знаю как все даты (3 месяца - январь, февраль и март) занести в параметр поиска. ПОиск будет проходить без задания параметров, .т.е. они будут уже прописаны, останется лишь только нажать enter по команде.
Код:
cout<<"Proizvesti poisk tovarov zimoy?"<<endl;
    cin >> zoomzoom;
    outFile<<"\t"<<zoomzoom<<"\n";

    for (i=0; i<n; i++)
    {if(strcmp (Dan.date, zoomzoom) == 0)
        {Output(Dan);
          k+=1;
        outFile<<Dan.magazin<<" "<<Dan.fio<<" "<<Dan.name<<"  "<<Dan.price<<"  "<<Dan.ostatok<<" "<<Dan.ostatak<<"\n";}
    }
    if (k==0)
    {cout << "Po vashemu zaprosy nichego ne najdeno";
    outFile<<"Po vashemu zaprosy nichego ne najdeno\n";}

    cout<<endl<<endl;
2.0K
29 октября 2007 года
BroKeR
163 / / 04.05.2006
Ну вообще ты можешь сделать нечто вроде меню.Чтобы не запрашивать параметр поиска.Это раз.Два,что бы найти по нескольким датам,надо передавать параметр поиска в каком-нибудь таком виде:par1&&par2&&par3.Когда будешь разбирать строку просто берешь параметр 1 до &,находишь нужную строчку,потом берешь параметр 2 до второго & и находишь нужную строчку...и т.д.
 
Код:
for (i=0; i<n; i++)
    {if(!strcmp (Dan.date, zoomzoom))//так лучше...
        {Output(Dan);
          k+=1;
        outFile<<Dan.magazin<<" "<<Dan.fio<<" "<<Dan.name<<"  "<<Dan.price<<"  "<<Dan.ostatok<<" "<<Dan.ostatak<<std::endl;}   
    }

а чем не устраивает моя реализация???
11K
30 октября 2007 года
mitrof4nov
68 / / 10.09.2007
У меня такой вопрос, вот полный код :
Код:
#include <iostream.h>  
#include <fstream.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>


#include <iostream.h>
    class class2;
    class class1  
     {int a;
      friend void fun(class1&,class2&);
      public:
         class1(int A) : a(A) { };
    };  
    class class2
    {int a;                            
     friend void fun(class1&,class2&);  
    public:
       class2(int A) : a(A) { };        };              
    void fun(class1& M1,class2& M2)  
        {if (M1.a == M2.a) cout << "equal\n";
         else cout << "non equal\n"; }
   

    class class3
    {int x,y;
    public:
      void read(int& X, int& Y)  const { X=x; Y=y; }
      void  write(int X, int Y)  { x=X; y=Y; }
      void  display() const;
      void e(void) const  { ((class3*) this)->x++; }    
    };
    void class3::display() const   {  cout << x << '\t' << y << endl;  }

static union
    { int a;
    };

struct Data {  
    char magazin[10], fio[20], year[10], in[5];
    int  count, ostatok, name, out;
    time_t date;
    float price;
    static void Stopper() {getch();}
   
};

    class Antey {
public:
    float price;
    int ostatok, out;
    };
    class Prodolit {
public:
    float price;
    int ostatok, out;
    };
    class Svetlana {
public:
    float price;
    int ostatok, out;
};
void Output(Data);

void main(void)
{  
   

    char *SrStK= "Srednyaya stoimost' knig v magazine ";
    char avtor[20], zoomzoom[15];
    float Ostatok=0, SrOstatok=0, Price, SrPrice;
    int n=0,q=0, w=0, e=0,i,k=0, Kolichestvo=0, S=50;
    fstream inFile;
        inFile.open("data.txt",ios::in);

    fstream outFile("file.txt",ios::out);

    if(!inFile.is_open())  
    {cerr << "Error\n";
    abort();      }  


    Data* Dan=new Data;
    Antey Ant[50];
    Prodolit Prod[50];
    Svetlana Svet[50];
    cout <<"\tHello \n";
    cout<<"Ves' spisok:" << endl;
    cout.setf(cout.left);
    cout.width(7);
    cout << "Magazin";
    cout.width(4);
    cout << "Type";
    cout.width(10);
    cout << "Country";
    cout.width(6);
    cout << "Price";
    cout.width(6);
    cout << "In";
    cout.width(5);
    cout << "Prodano";
    cout.width(5);
    cout << "Vsego";
    cout.width(15);
    cout << "Out";
    cout.width(15);
    cout << "Ostatok";
    cout.width(7);
    cout << "Date" << endl<<endl;


    while (inFile >> Dan[n].magazin>>Dan[n].fio>>
        Dan[n].year>>Dan[n].name>>Dan[n].count>>Dan[n].price>>Dan[n].in>>Dan[n].date)
       
    {   Dan[n].ostatok = Dan[n].name * Dan[n].price;
        Output(Dan[n]);
        n++;
    }
    inFile.close();
    cout<<endl<<endl;
    Data::Stopper();


//////////////////////////////////////////////
   

    while (inFile >> Dan[n].magazin>>Dan[n].fio>>
        Dan[n].year>>Dan[n].name>>Dan[n].count>>Dan[n].price>>Dan[n].in>>Dan[n].date)
       
    {   Dan[n].out = Dan[n].name * Dan[n].price;
        Output(Dan[n]);
        n++;
    }
    inFile.close();
    cout<<endl<<endl;
    Data::Stopper();
   


///////////////////////////////////////////////

   
    cout<<"Vvedite type PEVM"<<endl;
    cin >> avtor;
    outFile<<"\t"<<avtor<<"\n";

    for (i=0; i<n; i++)
    {if(strcmp (Dan.fio, avtor) == 0)
        {Output(Dan);
          k+=1;
        outFile<<Dan.magazin<<" "<<Dan.fio<<" "<<Dan.name<<"  "<<Dan.price<<"  "<<Dan.ostatok<<" "<<Dan.out<<"\n";}
    }
    if (k==0)
    {cout << "Po vashemu zaprosy nichego ne najdeno";
    outFile<<"Po vashemu zaprosy nichego ne najdeno\n";}

    cout<<endl<<endl;




    cout<<"Vvedite magazin"<<endl;
    cin >> zoomzoom;
    outFile<<"\t"<<zoomzoom<<"\n";

    for (i=0; i<n; i++)
    {if(strcmp (Dan.magazin, zoomzoom) == 0)
        {Output(Dan);
          k+=1;
        outFile<<Dan.magazin<<" "<<Dan.fio<<" "<<Dan.name<<"  "<<Dan.price<<"  "<<Dan.ostatok<<" "<<Dan.out<<"\n";}
    }
    if (k==0)
    {cout << "Po vashemu zaprosy nichego ne najdeno";
    outFile<<"Po vashemu zaprosy nichego ne najdeno\n";}




    cout<<endl<<endl;







   




    for (i=0; i<n; i++)
    { if (strcmp (Dan.magazin, "Antey")==0)
    { q+=1;
        Ant[q].price = Dan.price;
        Ant[q].ostatok = Dan.ostatok;}
        else
        {   if (strcmp (Dan.magazin, "Prodolit")==0)
        { w+=1;
        Prod[w].price = Dan.price;
        Prod[w].ostatok = Dan.ostatok;}
            else
            {   e+=1;
            Svet[e].price = Dan.price;
            Svet[e].ostatok = Dan.ostatok;}}
    }

    Data::Stopper();


       class1 mc1 = 100, mc3 = 200;
       class2 mc2 = 100;
       fun(mc1,mc2);                                
       fun(mc3,mc2);        
   
    int x,y;
       class3 A;    
       A.write(25,36);
       A.display();  
       A.e();      
       A.read(x,y) ;                                        
       cout << x << '\t' << y << endl;
       const class3 B=A;  
    cout <<"\n\t Spasibo za vnimanie!!! ";

}
   
    void Output (Data d)
{
    struct tm *t;

    cout.width(7);
    cout << d.magazin;
    cout.width(4);
    cout << d.fio;
    cout.width(10);
    cout << d.year;
    cout.width(6);
    cout << d.name;
    cout.width(6);
    cout << d.count;
    cout.width(5);
    cout << d.price;
    cout.width(5);
    cout << d.in;
    cout.width(15);
    cout << d.out;
    cout.width(15);
    cout<<(d.ostatok);
    t=gmtime(&d.date);
    cout << t->tm_mday << "." << (t->tm_mon+1) << "." << (1900+t->tm_year) << endl;
}


Почему не работает второй расчет по "out", ведь он написан так же как и расчет ostatok? Может другие параметры?!
Код:
while (inFile >> Dan[n].magazin>>Dan[n].fio>>
        Dan[n].year>>Dan[n].name>>Dan[n].count>>Dan[n].price>>Dan[n].in>>Dan[n].date)
       
    {   Dan[n].ostatok = Dan[n].name * Dan[n].price;
        Output(Dan[n]);
        n++;
    }
    inFile.close();
    cout<<endl<<endl;
    Data::Stopper();


//////////////////////////////////////////////
   

    while (inFile >> Dan[n].magazin>>Dan[n].fio>>
        Dan[n].year>>Dan[n].name>>Dan[n].count>>Dan[n].price>>Dan[n].in>>Dan[n].date)
       
    {   Dan[n].out = Dan[n].name * Dan[n].price;
        Output(Dan[n]);
        n++;
    }
    inFile.close();
    cout<<endl<<endl;
    Data::Stopper();
2.0K
30 октября 2007 года
BroKeR
163 / / 04.05.2006
Код:
while (inFile >> Dan[n].magazin>>Dan[n].fio>>
        Dan[n].year>>Dan[n].name>>Dan[n].count>>Dan[n].price>>Dan[n].in>>Dan[n].date)
       
    {   Dan[n].ostatok = Dan[n].name * Dan[n].price;
        Output(Dan[n]);
        n++;
    }
    inFile.close(); //здесь ты уже закрыл файл.
    cout<<endl<<endl;
    Data::Stopper();


//////////////////////////////////////////////
   
//а здесь пытаешься прочитать уже закрытый файл...
    while (inFile >> Dan[n].magazin>>Dan[n].fio>>
        Dan[n].year>>Dan[n].name>>Dan[n].count>>Dan[n].price>>Dan[n].in>>Dan[n].date)
       
    {   Dan[n].out = Dan[n].name * Dan[n].price;
        Output(Dan[n]);
        n++;
    }
    inFile.close();
    cout<<endl<<endl;
    Data::Stopper();
11K
30 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Но даже убрав атрибуты закрытия файла результат не измениться
2.0K
30 октября 2007 года
BroKeR
163 / / 04.05.2006
ЧТо конкретно не работает.Покажи ошибки которые выдает компилер.Я не экстрасенс...Ну и в первой прикидке надо добавить
 
Код:
using namespace std;

глянул художество,тягостное впечатление.Давай конкретно:что требуется,чем можно пользоваться,чег нужно добиться...
11K
30 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Идет без ошибок, просто при вычислении в столбце out идет по всем строкам "-842150451"..
2.0K
30 октября 2007 года
BroKeR
163 / / 04.05.2006
Цитата: mitrof4nov
идет по всем строкам "-842150451"..


это мусор,дебаж и смотри где разрушается объект.

11K
30 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Ладно! Но а если относительно кода: можно как-то в том коде составить вместе 2 функции умножения в одну?
2.0K
30 октября 2007 года
BroKeR
163 / / 04.05.2006
то как ты перегрузишь operator*() - лично твое дело.можешь заставить его заниматься вычитанием.Но ИМХО сама архитектура в твоем случае настолько не прозрачна,что есть вариант подумать как реализовать это более прямо...Я ж тебе говорю формализуй задачу.Что тебе конкретно ты хочешь добиться???Какими средствами???И исходя из этого уже можно плясать...Ну а касательно вот этого:
Цитата:
Но а если относительно кода: можно как-то в том коде составить вместе 2 функции умножения в одну?

Честно говоря ничего не понял...

11K
31 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Спасибо огромное, составить 2 функции.. просто тяжелый день был, голова не варила вообще. Извините пожалуйста.
Я буду вам очень благодарен, если вы мне еще подскажите реализацию по упорядочению дат. Знаю что пройдет это методом пузырька :) но относительно текущих классов у меня ничего не получается. Помогите, я буду вам очень благодарен.
2.0K
31 октября 2007 года
BroKeR
163 / / 04.05.2006
Ты сам писал тот фрагмент который привел???Еще раз тебе говорю программу как ни читал,не понял ровным счетом ничего,куча ненужых классов,объединение с одним членом(не сочтите за каламбур...),говорю,то что написано у тебя,лично я не понимаю...Что конкретно нужно ты можешь человеческим языком написать???Про пузырьковую сортировку гугл в руки.Но еще раз повторюсь,в твоем коде я непонял ровным счетом ничего....Может реализовать немного по другому????
11K
01 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
Как вы смотрите на нее - так и попробуйте.
11K
02 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
полностью переделал код (все в фаиле)

Но не судите строго, пожалуйста, как всегда :) не могу справиться с ошибками (например не правильно реализовал вычисление ячеек stpros и stost). Подскажите как их можно исправить :( я буду вам очень благодарен.

Исходная строка в фаиле:
Komtek IBM China 45000 7 5 Bad 21.03.2001 18.03.2001
2.0K
02 ноября 2007 года
BroKeR
163 / / 04.05.2006
Слушай,ты можешь написать что ты хоешь?то что у тебя есть-очень и очень плохо...
11K
03 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
Ну пожалуйста подскажите, почему например в этом фрагменте
 
Код:
while (input >> list[n].magazin>>list[n].tippvm>>
        list[n].country>>list[n].price>>list[n].inmag>>list[n].outmag>>list[n].prim>>list[n].dataprov>>list[n].datapost)
       
    {   list[n].ostatok = list[n].name * list[n].price;
        Output(list[n]);
        n++;
    }
    input.close();
    cout<<endl<<endl;
    Data::Stopper();

идет ошибка error C2296: '>>' : illegal, left operand has type 'void (__thiscall newew::*)(void)'

Не в тот класс записал?!
320
03 ноября 2007 года
m_Valery
1.0K / / 08.01.2007
mitrof4nov,вот ознакомся для общего развития с этой темой.
BroKer прав.У тебя очень "не прозрачный" вариант решения достаточно простой задачи.Тебе необходимо для начала выработать требования к проекту.Чтобы их выработать , нужно четко представить себе потребности будующих пользователей и то каким образом программа должна удовлетворять эти потребности.Можно выделить два основных момента в проведении обьектно-ориентированного анализа. Первый &#8211; это краткое , наиболее общее формулирование требований к программе с точки зрения конечного пользователя.
Второй момент &#8211; анализ ситуаций использования , где рассматриваются все возможные цели и действия пользователей при использовании программы и то каким образом программа должна реагировать на каждую из возможных ситуаций.Рассмотри ситуации ввода данных, ситуации поиска и отображения записей,ситуации возникновения ошибок,хотя бы эти. Построй диаграмму классов и выясни для себя четко для чего служит каждый класс.Ты ничего этого не делал...Только потом начинай писать код.
11K
05 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
Отрабатывает без ошибок, но сортироовка как таковая не проходит. Подскажите пожалуйста где я ошибся в не, буду очень благодарен.
11K
06 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
Дата записывается в обычном формате DD.MM.YYYY и если вас не затруднит, не могли бы вы помочь, как организовать сортровку сначало по году, потом по месяцу, а затем по дням.

Видимо сначало необходимо отсчитать 4 символа с конца до точки, их отсортировать, потом цикл по месяцам и т.д. Помогите пожалуйста, буду благодарен.
361
06 ноября 2007 года
Odissey_
661 / / 19.09.2006
Думаю циклами не стоит.
Как вариант, можно перевести дату в одно число
 
Код:
unsigned int split_date(unsigned int year, unsigned char month, unsigned char day)
{
    return (year*10000 + month*100 + day);
}

и далее сортировать по нему.
11K
06 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
Мне просто циклами необходимо.
Ну а если переведем в число, отсортируем пузырьком, а обратно как осуществить перевод, что бы грамотно на экране отобразилось?
361
06 ноября 2007 года
Odissey_
661 / / 19.09.2006
Чего то я непойму. Причем здесь циклы? Из постановки задачи это не ясно.
И причем здесь пузырек? Отсортируй sort`ом из stl.
Цитата:
Необходимо организовать сортировку по предпоследнему значению, т.е. по дате. (в нашем случае это 21.12.2006, 01.04.2006,...)


Код:
struct TRecord
{
  string name; // твои поля
  ...
  string first_date;
  string second_date;
  unsigned int  key; // поле по которому сортируем
  bool operator < (const TRecord &_t)const;
}

bool TRecord::operator < (const TRecord &_t) const
{
    return (this->key < _t.key);
}

...
TRecord  data_record;
vector<TRecord>  data_table;
...
data_record.key = split_date(data_record.first_date);
data_table.push_back(data_record);
...
sort(data_table.begin(), data_table.end());

Я могу ошибатся, но помоему это кроспостинг из студентов.
11K
06 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
Задание : отсортировать даты в порядке возрастания. (метод в принципе не важен).

Я то думал отсортировать сравнением строк, но не знаю как разбить всю дату на отдельные части, что бы потом с помощью strstr сравнивать, и упорядочивать пузырьком.
11K
07 ноября 2007 года
mitrof4nov
68 / / 10.09.2007
а допустим если так
Код:
char date[11];    // дата в строковой записи - 10 символов и 11-й символ конца строки
char day[3];      //день - два символа на дату и один на символ конца строки
char month[3];  //месяц
char year[5];    //год
i = 0;
k = 0;
while (i < 2)  //Копируем день
{
  day[k] = date;
  k++;
  i++;
}
day[2] = "\0";

i = 3;
k = 0;
while (i < 5)  //Копируем месяц
{
  month[k] = date;
  k++;
  i++;
}
month[2] = "\0";

i = 6;
k = 0;
while (i < 10)  //Копируем год
{
  year[k] = date;
  k++;
  i++;
}
year[5] = "\0";

но если у меня дана такая строка(их 10, но содержание похожее), то не затруднит ли вас показать, как отсортировать все остальные данные? Ведь у меня каждое слово - это как массив.:
Sibron Mac Tokio 39000 10 7 Bad 11.03.2006 07.03.2006
2.0K
07 ноября 2007 года
BroKeR
163 / / 04.05.2006
Откажись ты от своего убого решения,все можно сделать намного проще и лаконичнее,тебе уже показали как сделать поиск и сортировку.Все что ты здесь пишешь не просто плохо,а очень плохо...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог