Zeile aus txt suchen



  • hallo,

    ich programmiere ein Verwaltungsprogramm(für Elektrobauteile)mit c++ für die Schule.
    Die Bauteile werden in einer txt gespeichert.
    Nun habe ich eine funktion zum suchen, die mir aber leider nur gesuchte zeile ausgibt. Ich will abr das sie mir 4 Zeilen ausgibt (bzw. mehr aber 4 pro Suchergebnis). Es wird Hersteller, Typ, Stückzahl und Lagerort gespeichert. Egal was ich davon suche es soll immer das komplette Bauteile ausgegeben werden also alle 4 Sachen. HILFE!

    das ist die Funktion:

    void RS()
    {

    int x=0;
    string suchen;

    string ort="Bauteile\\Passiv\\Widerstände\\Widerstände.txt",name;

    schreiben.open(ort.c_str(),ios::in);

    cin>>suchen;

    bool eof;

    do{
    eof=getline(schreiben,name);

    int pos = name.find(suchen,0);

    if(pos!=-1)
    {
    cout<<name<<endl;

    }
    x++;
    }
    }while(eof==1);
    schreiben.close();
    }

    MFG



  • Wenn du einen Treffer hast, musst du zuerst den Bereich eingrenzen, den du ausgeben möchtest, d. h. der zum Bauteil gehört. Das lässt sich relativ leicht feststellen, da jeder Eintrag aus vier Zeilen besteht (BTW: Du könntest doch auch eine Zeile pro Bauteil machen und die Komponenten beispielsweise durch Semikolon trennen).

    Wenn du einen Treffer in Zeile 15 hast, weißt du, dass die Beschreibung des Bauteils bei 15 - (15 % 4) + 1 = 13 anfängt und bei 15 - (15 % 4) + 5 = 16 aufhört. Dafür musst du natürlich die Zeilennummer in einer Variablen speichern und mitzählen.

    Da du auch zurückliegende Zeilen ausgeben möchtest, bietet es sich an, die jeweils letzten drei Zeilen in einem Verlauf zu speichern. Wenn du nun die nächste Zeile einliest, wirfst du die älteste Zeile aus deinem Verlauf raus. Besonders geeignet dafür wäre der Container std::queue.



  • puh container habsch nit wirklich ahnung(bin noch recht neu in dem kram^^)
    ... wie sähe das denn aus? 😛



  • google.de -> "std::queue"

    2. suchergebnis:

    http://de.wikipedia.org/wiki/C%2B%2B-Standardbibliothek

    sieht eigtl au ganz brauchbar aus ^^

    edit: bevor wieder einer kommt, der bemerkt, dass dort kein bsp mit std::queue gemacht wird und rumheult...
    er meinte, dass er kein plan davon hat usw - also ist es vll am besten, wenn man erst mal weiß, was das überhaupt ist - danach kann man noch immer bei cppreference.com nach den membern gucken und Bsp. findet man wahrscheinlich hier im Forum genug. 😛



  • Definier dir doch deine eigene Queue-Klasse, wenn du, so wie ich, nicht weisst, wie man mit diesem Queue-Container-Ding umgeht:

    //** my_queue.h **//
    #ifndef ___MY_QUEUE_H___
    	#define ___MY_QUEUE_H___
    	#include<string>
    	#include <exception>
    	namespace myq{
    		class queue{
    		private:
    			std::string *element;
    			unsigned char number_of_elements;
    		public:
    			queue(const unsigned char& _number_of_elements);
    			std::string get_last_inserted_element(void);
    			std::string get_element(const unsigned char& _pos);
    			void insert_element(const std::string& _str_to_store);
    		};
    
    		//Methodes:
    		queue::queue(const unsigned char& _number_of_elements){
    			this->number_of_elements=_number_of_elements;
    			element=new std::string[_number_of_elements];
    			for(unsigned char cnt=0;cnt<_number_of_elements;++cnt)
    				this->element[cnt].clear();
    		}
    		std::string queue::get_last_inserted_element(void){
    			return this->element[this->number_of_elements-1];
    		}
    		std::string queue::get_element(const unsigned char& _pos){
    			if(_pos<=this->number_of_elements-1)
    				return this->element[_pos];
    			else
    				throw std::exception("This element doesn't exist!!!",0);
    		}
    		void queue::insert_element(const std::string& _str_to_store){
    			for(unsigned char cnt1=0,cnt2=0;cnt1<=this->number_of_elements-2;++cnt1)
    				this->element[cnt1]=this->element[++cnt2];
    			this->element[this->number_of_elements-1]=_str_to_store;
    		}
    	}
    #endif
    

    Das mit der Suchfunktion ist dann nicht mehr schwer:

    #include <iostream>
    #include <fstream>
    #include "my_queue.h"
    
    void suche_artikel(void){
    	std::string suchen;
    	std::cin>>suchen;
    
    	std::ifstream datenbank;
    	datenbank.open("data.txt",std::ios_base::in);
    
    	std::string name; myq::queue stack(4);
    	for(unsigned long zeile=1;getline(datenbank,name);++zeile){
    		stack.insert_element(name);
    		if(name.find(suchen,0)!=-1){
    			if(!(zeile%4)){
    				for(int cnt1=0;cnt1<4;++cnt1)
    					std::cout<<std::endl<<stack.get_element(cnt1);
    			}
    			else if(!(zeile%3)){
    				for(int cnt1=1;cnt1<4;++cnt1)
    					std::cout<<std::endl<<stack.get_element(cnt1);
    				getline(datenbank,name);
    				stack.insert_element(name);
    				std::cout<<std::endl<<name;
    			}
    			else if(!(zeile%2)){
    				for(int cnt1=2;cnt1<4;++cnt1)
    					std::cout<<std::endl<<stack.get_element(cnt1);
    				for(int cnt2=0;cnt<2;++cnt){
    					getline(datenbank,name);
    					stack.insert_element(name);
    					std::cout<<std::endl<<name;
    				}
    			}
    			else{
    				std::cout<<std::endl<<stack.get_element(3);
    				for(int cnt2=0;cnt<3;++cnt){
    					getline(datenbank,name);
    					stack.insert_element(name);
    					std::cout<<std::endl<<name;
    				}
    			}
    			std::cout<<std::endl;
    		}
    	}
    	datenbank.close();
    }
    


  • Lass dich bitte nicht von dem Unregistrierten bequasseln und benutze std::queue.

    http://cppreference.com/cppqueue/queue_constructor.html



  • Michael E. schrieb:

    Lass dich bitte nicht von dem Unregistrierten bequasseln und benutze std::queue.

    http://cppreference.com/cppqueue/queue_constructor.html

    Ich sehe grundsätzlich schon ein, dass es wenig sinnvoll ist das Rad neu zu erfinden. Nachdem ich mir diesen Queue-Container mal angesehen habe, muss ich sagen, dass dieses Teil hier acuh tatsächlich wahnisinnig gelegen kommt.
    Aber, die STL ist leider niergends so wirklich einfach erklärt, weshalb ich ganz einfach halb so lange habe um eine eigene Klasse zu schreiben. (Ausserdem mache ich das ja auch nicht kommerziell; will heissen, es darf auch mal "nur funktionieren" und halt hässlichst aussehen bei mir.)
    Mit diesem queue hab ich's übrigens wie folgt hinbekommen:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <fstream>
    #include <queue>
    
    void suche_artikel(std::string _dateiname,unsigned long _artikel_pro_block){
    	std::string suchen;
    	std::cin>>suchen;
    	getchar();
    
    	std::ifstream datenbank;
    	datenbank.open(_dateiname.c_str(),std::ios_base::in);
    
    	std::string name;
    	std::queue<std::string> stack;
    	for(unsigned long zeile=1;getline(datenbank,name);++zeile){
    		stack.push(name);
    		if(name.find(suchen,0)!=-1){
    			std::queue<std::string> pushed_stack=stack;
    			unsigned long element_nr=(zeile%_artikel_pro_block);
    			if(element_nr==0)
    				element_nr=4;
    			while(stack.size()>element_nr)
    				stack.pop();
    			while(stack.size()>0){
    				std::cout<<std::endl<<stack.front();
    				stack.pop();
    			}
    			stack=pushed_stack;
    			while(++element_nr<=_artikel_pro_block){
    				getline(datenbank,name);
    				stack.push(name);
    				std::cout<<std::endl<<name;
    				++zeile;
    			}
    			std::cout<<std::endl;
    		}
    	}
    	datenbank.close();
    }
    

Anmelden zum Antworten