Jump to content
gotr00t

DupeRemover.1.0- C++ Dev Project

Recommended Posts

D4E3d.png]

#################

Creat de demisec(adica eu)

Site: www.rstcenter.com

Link 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 by gotr00t
Link to comment
Share on other sites

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 ;)

Link to comment
Share on other sites

##############

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.

Link to comment
Share on other sites

Da don't send ca ai matricea alocata doar pe X linii.

Ai putea sa incerci


citesc_sir
transform in hash
daca(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 by Patrunjel
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...