gotr00t Posted February 25, 2012 Report Posted February 25, 2012 (edited) #################Creat de demisec(adica eu)Site: www.rstcenter.comLink Download: AICI##################################Descriere:Mai exact e de folos cand aveti fisiere mari, cu multe linii duplicate. De exemplu ai un fisier cu emailuri extrase dintr-o baza de date, in care se gasesc si duplicate. Tu vrei sa ramai cu mailurile intr-un singur exemplar. Cum faci? Iei continutul fisierului tau si il copiezi in "fisier.txt". Rulezi acum programul run.exe. O sa iti lase in "fisierout.txt" toate emailurile, intr-un singur exemplar.##################################Pentru sugestii va rog sa postati aici.##################################Sursa:#include<fstream>#include<iostream>#include<windows.h>#include<string.h>#include<conio.h>using namespace std;void begin_screen(){ string welcome[6]={ "====================", "|Demisec waz here,|", "|Dupe Line remover,|", "|www.rstcenter.com|", "--------------------", }; int i; for(i=0;i<6;i++) cout<<welcome[i]<<endl;}int main (){ ifstream f("fisier.txt"); ofstream g("fisierout.txt"); char s[251][251]; int k=0,i,n=0,j; system("color 0F"); begin_screen(); system("Pause"); while(f.get(s[++k],250)) { n++;f.get(); } for(i=1;i<=n;i++) { k=0; for(j=i+1;j<=n+1;j++) if(strcmp(s[i],s[j])==0) k++; if(!k) g<<s[i]<<endl; } cout<<endl<<endl<<"Am terminat de eliminat duplicatele. Rezultatele se afla in"<<endl<<"fiserul \"fisierout.txt\" . www.rstcenter.com"; getch();}##################Stiu ca nu e cine stie ce, dar daca e de ajutor e ok. Demises waz here! Edited February 25, 2012 by gotr00t Quote
Paul4games Posted February 25, 2012 Report Posted February 25, 2012 Ar trebui sa postezi si sursa ca sa iti mai poata da lumea sugestii de cum sa o imbunatatesti.......iar fisierout.exe nu ar trebui sa fie fisierout.txt? Quote
gotr00t Posted February 25, 2012 Author Report Posted February 25, 2012 Fac ordine in sursa si o postez in seara asta. Am modificat si in post, multumesc:) Quote
alien Posted February 25, 2012 Report Posted February 25, 2012 Nu e putin ineficient sa faci for pe tot sirul s citit? La ultimul string cand il verifici treci prin tot for-ul ala. Parerea mea ca ar trebui sa folosesti un hash table. Un hash table are grija sa nu exista duplicate in el. Deci parcurgi o singura data fisierul, bagi tot in hash si apoi scri output-ul. Doar o idee Quote
gotr00t Posted February 25, 2012 Author Report Posted February 25, 2012 Multumesc mult. O sa ma documentez si o sa implementez. Daca e apreciata ideea(care, in mare nu e una geniala, din contra) ma gandesc sa fac un text editor/formator. Multumesc inca o data, te caut prin PM daca e sa fiu nedumerit? Quote
phreak Posted February 25, 2012 Report Posted February 25, 2012 Fara suparare dar ala nu-i C++, e C cu I/O de C++.P.S : Daca ai nesansa sa folosesti dev-cpp ca si IDE cauta-ti altul. Quote
crs12decoder Posted February 26, 2012 Report Posted February 26, 2012 Denumirile fisierelor ar trebui sa fie si ele variabile. Le poti citi ca argumente in linia de comanda sau de la tastatura.Algoritmul folosit la prima vedere e unul destul de simplu. Atata timp cat isi face treaba, e bine. Te poti gandi insa si la alte metode mai optime. Quote
gotr00t Posted February 26, 2012 Author Report Posted February 26, 2012 ##############Bug:La peste 250 linii de text da don't send.2nd Bug: Daca intalneste linii de cod goale se opreste##############In versiunea urmatoare, 1.01 o sa implementez hash-uri(cu ajutorul lui nedo), o sa rezolv bugurile si o sa adaug optiuni de formatare. Astept feedback in continuare. Quote
cifratorul Posted February 26, 2012 Report Posted February 26, 2012 vreau sa reamintesc celor ce vor o solutie simpla/rapida de a elimina liniile duplicate dintr-un fiser. se poate folosi doar o linie de awk:awk '! a[$0]++' Quote
Patrunjel Posted February 26, 2012 Report Posted February 26, 2012 (edited) Da don't send ca ai matricea alocata doar pe X linii. Ai putea sa incerci citesc_sirtransform in hashdaca(hashul nu era deja folosit)adaug hashul ca folosit, apoi outputez sirul citit Asa o sa-ti mearga pe fisiere mai mari (in forma asta e destul de lent). Ca hash poti sa folosesti o functie lejera, nu md_naispe, doar ca sa-l folosesti ca identificator pentru un anumit string.Partea proasta e ca iti rupe memoria (oricum, ai putea sa primesti ca input fisiere ceva mai mari), oricum, mai bine iti umple ramii pentru 2 secunde decat sa astepti cu minutele.*hashul nu-l memorezi intr-un vector, ca o sa fie rar si n-ai facut nimic. Il bagi intr-o lista. Nu mai ai O constant, devine liniar, da tot e mai bun decat patratic.LE: Scuze, n-am vazut ca ai deja de gand sa incerci cu hashuri. Edited February 26, 2012 by Patrunjel Quote
nedo Posted February 27, 2012 Report Posted February 27, 2012 Observand ca gotroot e banat, va postez mai jos versiunea creata de mine, folosind libraria map din stl.Aceasta versiune i-am trimis-o lui gotroot acum 2 zile pentru a vedea cum pot fi folosite hash-urile.Pe un fisier cu 15000 de linii programul ocupa doar 1.5 mb.#include <iostream>#include <fstream>#include <map>#include <string>using namespace std;int main(int argc, char* argv[]){ if(argc < 3) { cout << "Utilizare: " << argv[0] << " fisierIntrare fisierIesire " << endl; } else { ifstream fin(argv[1]); ofstream fout(argv[2]); map<string, int> buffer; // cheia este stringul pentru ca aceasta trebuie sa fie mereu diferita int index = 0; if(fin.is_open() && fout.is_open()) { while(fin.good()) { string linie; getline(fin, linie); buffer[linie] = index; } for(map<string, int>::iterator it = buffer.begin(); it != buffer.end();it++) { fout << (*it).first << endl; } } else { cout << "Nu am putut deschide " << argv[1] << " sau " << argv[2] << endl; fin.close(); fout.close(); } } return 0;}Daca se doreste si o versiune cu gui, postati aici si voi incerca sa fac o versiune cu gui in c++ cu wxwidgets. Quote
nedo Posted February 27, 2012 Report Posted February 27, 2012 heh, nu stiam ca tu ai si contul asta ... Quote