Jump to content
gotr00t

DupeRemover.1.0- C++ Dev Project

Recommended Posts

Posted (edited)

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
Posted

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

Posted

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?

Posted

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.

Posted

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

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.

Posted (edited)

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
Posted

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.

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...