Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa file-ovima

[es] :: C/C++ programiranje :: problem sa file-ovima

[ Pregleda: 2295 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

memo23

Član broj: 113586
Poruke: 13
*.hermes.si.



Profil

icon problem sa file-ovima03.03.2008. u 15:40 - pre 196 meseci
Pozdrav,

imam jedan problem ili vise od problema, vec par dana radim na tome i nikako ne mogu da rijesim...
problem je sljedeci...

Imam jedan fajl (txt file) i unutra su neki podaci.
u tim podacima ima nekih znakova, tipa <--,--> i tako dalje (znaci ja citam taj file).
e sad ja moram naci te znakove i kad ih nadjem moram ih pomjeriti za "neki"(nije vazno koliko) odredjen broj mjesta (space je u pitanju).
i kad se to odradi to treba da se stavi u neki novi fajl.

e ako ima neku ideju kako da pronadjem i pomjerim te znakove nek' slobodno napise....
a ko ima rjesenje nek ga stavi bio bu mu zahvalan.

hvala unaprijed

[Ovu poruku je menjao memo23 dana 03.03.2008. u 16:55 GMT+1]

[Ovu poruku je menjao memo23 dana 03.03.2008. u 16:55 GMT+1]

[Ovu poruku je menjao memo23 dana 03.03.2008. u 17:38 GMT+1]
 
Odgovor na temu

memo23

Član broj: 113586
Poruke: 13
*.hermes.si.



Profil

icon Re: problem sa file-ovima11.03.2008. u 16:02 - pre 196 meseci
vidim da niko nije bas raspolozen da neke komentare.
ovako ovo je moj izvorni fajl:
[00000 13:28:11.628] NOTE Glavni...
=== Stack trace dump ===
=== End ===

[02736 13:28:11.628] --> 1 nesto
[02736 13:28:11.628] <-- 1 nesto
[02736 13:28:11.628] --> 1 nesto
[02736 13:28:11.628] <-- 1 nesto
[02736 13:28:11.628] --> 1 nesto
[02736 13:28:11.628] NOTE Glavni...
=== Stack trace dump ===
1. main()
=== End ===

[02736 13:28:11.628] --> 2 nesto
[02736 13:28:11.628] --> 3 nesto
[02736 13:28:11.628] <-- 3 nesto
[02736 13:28:11.628] <-- 2 nesto
[02736 13:28:11.628] --> 2 nesto
[02736 13:28:11.628] --> 3 nesto
[02736 13:28:11.628] <-- 3 nesto
[02736 13:28:11.628] <-- 2 nesto
[02736 13:28:13.081] <-- 1 nesto
[02736 13:28:13.081] --> 1 nesto
[02736 13:28:13.081] <-- 1 nesto
[02736 13:28:13.081] --> 1 nesto
[02736 13:28:13.081] <-- 1 nesto

a ovako bi trebao da bude izlazni (drugi) fajl:

[00000 13:28:11.628] NOTE Glavni...
=== Stack trace dump ===
=== End ===

[02736 13:28:11.628] *--> 1 nesto //ako je broj jedan(i strelice) pomjeri za jedno mjesto udesno
[02736 13:28:11.628] * <-- 1 nesto
[02736 13:28:11.628] *--> 1 nesto
[02736 13:28:11.628] *<-- 1 nesto
[02736 13:28:11.628] *--> 1 nesto
[02736 13:28:11.628] NOTE Glavni...
=== Stack trace dump ===
1. main()
=== End ===

[02736 13:28:11.628] **--> 2 nesto//ako je broj dva(i strelice) pomjeramo za dva mjesta u desno
[02736 13:28:11.628] ****--> 3 nesto//ako je broj tri (i strelice) pomjermao za cetri mjesta u desno
[02736 13:28:11.628] ****<-- 3 nesto
[02736 13:28:11.628] **<-- 2 nesto
[02736 13:28:11.628] **--> 2 nesto
[02736 13:28:11.628] ****--> 3 nesto
[02736 13:28:11.628] ****<-- 3 nesto
[02736 13:28:11.628] **<-- 2 nesto
[02736 13:28:13.081] *<-- 1 nesto//broj jedan(i strelice) pomjeramo za jedno mjesto
[02736 13:28:13.081] *--> 1 nesto
[02736 13:28:13.081] *<-- 1 nesto
[02736 13:28:13.081] *--> 1 nesto
[02736 13:28:13.081] *<-- 1 nesto
posto imam problema sa stranicom kada stavim prazno mjesto, umjesto praznih mjesta stavio sam * (zvjezdicu)
moje rjesenje je sljedece:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main ()
{


ifstream fin("c:\\example.txt"); //fajl iz kojeg citamo
string s; //string koji pamti sve linije naseg fajla
size_t found,pos,pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9;//varijable za pronalzenje "stringova" u fajlu
ofstream Upis ("c:\\b.txt"); //fajl u koji pisemo

if(!Upis.fail())
{
while ( getline( fin, s ) )//citanje fajla liniju po liniju
{
string::iterator it= s.begin();
found=s.find(" 2 "); //nasi poredbeni stringovi
pos1=s.find(" 3 ");

pos3=s.find(st3);

if ((pos3!=string::npos))
{
it+=20;
s.replace(it,it,test);
}
if ((found!=string::npos) ) //dok ga nenadje
{
//s.replace(20,0," ");
s.insert(20," ");
}
if (pos1!=string::npos)
{
s.replace(20,0," ");
}
i
cout << s << endl;//ispisujemo nase promjene
Upis<<s<<endl;//ispis u fajl nasih "promjene"
}
cout<<"============================================="<<endl;
cout<<"\n\n\SADRZAJ FAJLA USPJESNO DODAN\n\n"<<endl;


}
else

cout<<"\nProblem pri otvaranju fajla u koji kopiramo."<<endl;
return 1;
}

e sada, testirao sam i ovaj kod radi i pravi odredjene promjene koje su potrebne. ovo je jedan lagan zadatak koji ima tri "levela".
Medjutim sta ako imam 100 "levela", onda bih trebao da pisem 100 if-ova i to je normalno problem.
e ako ima neku ideju da ovo rijesim "dinamicki"(ili ako ima neki laksi nacin) nekako bilo bi dobro.
pa ako ima neku ideju kako bi se jos moglo ovo da rijesi slobodno recite.

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: problem sa file-ovima11.03.2008. u 17:49 - pre 196 meseci
Zašto za 1 pomeraš 1 mesto, za 2 pomeraš 2 mesta, a za 3 pomeraš 4 mesta ? Otkuda sada to pravilo ?

Evo ti jedno brzo (i totalno netestirano) rešenje sa EXE-om prilogu (Borland C++ Builder) i sistemskim fajlovima vec upakovanim u EXE (zato je malo veci).
Code:

...
void __fastcall TForm1::ProcessLog()
{
   for ( int i=0; i<Memo1->Lines->Count; i++ )
   {
      int pos1 = AnsiPos( "-->", Memo1->Lines->Strings[i] );
      int pos2 = AnsiPos( "<--", Memo1->Lines->Strings[i] );

      if ( ( pos1 > 0 ) || ( pos2 > 0 ) )
      {
         int pos =  pos1 > 0 ? pos1 : pos2;

         AnsiString Broj;
         for ( int j=pos+4; Memo1->Lines->Strings[i][j] != ' '; j++ )
            Broj = Broj + Memo1->Lines->Strings[i][j];

         int IntBroj;
         try
         {
            IntBroj = Broj.ToInt();
         }
         catch ( const Exception &e )
         {
            ShowMessage( e.Message );
            Abort();
         }

         AnsiString ZaUmetanje = DupeString( " ", IntBroj );
         AnsiString NoviString = Memo1->Lines->Strings[i].Insert( ZaUmetanje, pos );

         Memo2->Lines->Add( NoviString );
      }
      else
      {
         Memo2->Lines->Add( Memo1->Lines->Strings[i] );
      }
   }
}

...

Prikačeni fajlovi
 
Odgovor na temu

memo23

Član broj: 113586
Poruke: 13
*.hermes.si.



Profil

icon Re: problem sa file-ovima12.03.2008. u 12:46 - pre 196 meseci
E hvala ti na ovom rjesenju.
ti si izgleda ovo uradio preko sistemski funkcija.
koju bih ja na primjer mogao da koristim u .net-u, takko da mogu rijesim ovaj problem.
Sto se tice pomjeranja(za koliko cemo da pomaknemo) to i nije neki problem...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: problem sa file-ovima12.03.2008. u 13:03 - pre 196 meseci
Resenje koje si dobio zasnovano je na VCL biblioteci klasa (Delphi, C++ Builder). U osnovi koriscene su vrlo upotrebljive klase AnsiString i TStrings (TStringList).

Semanticki gledano, .NET pristup iteraciji kroz listu stringova, pristup pojedinacnim elementima liste i elementima pojedinacnog stringa - je skoro isti.

Sve od metoda koje imas u primeru postoje (kao ekvivalenti) i kod .NET String klase. A postoje i u STL string.

Mozes da biras tehnologiju kojom ces resiti problem, a primer koji imas je cisto da vidis semantiku algoritma.
 
Odgovor na temu

memo23

Član broj: 113586
Poruke: 13
*.hermes.si.



Profil

icon Re: problem sa file-ovima13.03.2008. u 10:30 - pre 195 meseci
Pozdrav X Files,

evo nesto sam kontao i dosao sam na sljedecu ideju.
znaci ideja je da prvo provjeravam sta mi je na prvoj poziciji mog log fajla.
ako je "[" (ovaj znak na je potreban) uzmi tu liniju, i posto je ovaj log fajl uvijek fiksan ja cu uzeti ono sto mi je na 26 poziciji te linije. tj tu se nalazi nas broj.
uzimam taj karakter iz stringa i kovertujem ga u broj (e tu je problem - kod konverzije).
zatim imam jedan string koji sadrzi jedno prazno mijesto (space).
i na kraju se nalazi for petlja koja sam dodaje broj "space+ova" od broja koji smo uzeli.
i dodajemo fiksno na neku lokaciju.
evo tog mog koda kako sam odradio.

size_t pos=s.find("[");//trazim ovaj znak

string s1=" ";//moj "prazni" string
if (pos!=string::npos){

for (int i =0;i<(s[26]-49);i++){//e ovo mi se ne svidja kako sam ovo prebacio u int, dali ima neki drugi nacin,pokusao sam sa "sstream-om" al ne ide
//cout<<"i:"<<i<<endl;
s1+=" " ;

}
s.insert(20,s1);

}
u ovom kodu mi se ne svidja u for petlji ova "konverzija".
X files ako mozes da mi "kazes" kako da konvertujem clan stringa u int al da bude u c++ (.net)
dali ima ne ka funkcija sistemska ili nesto drugo.
i jos jedno pitanje sta ako je broj 10 ili veci kako cu onda moci da uzmem broj deset jel u mom slucaju ja cu uzeti od broj 10 samo broj 1, e ako jos moze to bilo bi super da se rijesi.
hvala unaprijed i nadam se da nisam dosadan
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: problem sa file-ovima13.03.2008. u 15:38 - pre 195 meseci
Programeru moj, ti si potpuno pomesao STL i .NET. Govoris o .NET a pises STL kod.

Ok, prema tvojim zahtevim kod moze biti ovakav /opet netestirano/:
(pretpostavljam da si dobro brojao one karaktere gde ide umetanje, jer ja nisam)

Pokretanje treba da bude sa dva argumenta u komandnoj liniji:
PROGRAM.EXE fajl_ulazni.log fajl_izlazni.log


Code:

#include <string>
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;

int main( int argc, char* argv[] )
{
   if ( argc != 3 )
   {
      cout << "Program zahteva dva ulazna argumenta:\n";
      cout << "PROGRAM fajl_ulazni fajl_izlazni";
      cin.ignore();
      return 1;
   }

   string jedna_linija;
   vector<string> vektor_stringova;
   vektor_stringova.clear();

   ifstream fajl_ulazni  ( argv[1] );
   ofstream fajl_izlazni ( argv[2] );

   while ( getline( fajl_ulazni, jedna_linija, '\n') )
       vektor_stringova.push_back ( jedna_linija );

   for ( int i=0; i<vektor_stringova.size(); i++ )
   {
      if ( vektor_stringova[i][0] == '[' )
      {
         string string_broj;
         for ( int j=25; vektor_stringova[i][j] != ' '; j++ )
            string_broj = string_broj + vektor_stringova[i][j];

         int int_broj =  atoi( string_broj.c_str() );

         for ( int j=0; j<int_broj; j++ )
            vektor_stringova[i].insert( 20, " " );
      }
      fajl_izlazni << vektor_stringova[i] << endl;
   }

   fajl_izlazni.close();
   fajl_ulazni.close();

   cin.ignore();
   return 0;
}


EDIT: X Files
Uklonjen try/catch blok, na osnovu teksta:
http://www.novetehnologije.com...nvertovanje-teksta-u-broj.aspx
... gde lepo piše da atoi() ne baca izuzetak, pa je stoga i bespotrebno. Ako ipak postoji potreba za utvrdjivanjem da li je broj ili nije, koristiti lexical_cas iz boost biblioteke, što takođe ima upisano na linku.

[Ovu poruku je menjao X Files dana 14.03.2008. u 08:50 GMT+1]
 
Odgovor na temu

memo23

Član broj: 113586
Poruke: 13
*.hermes.si.



Profil

icon Re: problem sa file-ovima18.03.2008. u 15:07 - pre 195 meseci
e X,

puno ti hvala na pomoci, ma ja sam pocetnik pa mjesam nek stvari...
ako imas neke tutorijale da preporucis slobodno daj link
 
Odgovor na temu

[es] :: C/C++ programiranje :: problem sa file-ovima

[ Pregleda: 2295 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.