CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dziwny Folder docelowy zapisu pliku

Dziwny Folder docelowy zapisu pliku

dział ogólny

Dziwny Folder docelowy zapisu pliku

Nowy postprzez politech » sobota, 7 sierpnia 2010, 19:39

Mam taki oto zapis:
KOD cpp:     UKRYJ  
void zapisz()
{
  list<AnsiString>::iterator k;
  k=serv.begin();
  char buff[80];
  ofstream plik;
  plik.open("aktualny.txt");
  if(!plik)
  {
        ShowMessage("blad pliku z aktualnymi");
        return;
  }

  while(k!=serv.end())
  {
        AnsiString p=*k;
        plik<<p.c_str()<<endl;
        k++;
  }
  plik.close();
}


Nie wiem dlaczego plik aktualny tworzy się na pulpicie a nie w folderze z programem, ścieżka do programu: C:\Documents and Settings\Przemek\Desktop\New Folder (3)\Stringi

Odczyt tego pliku otwiera za to plik aktualny, który znajduje się w folderze z programem(sam go tam umieściłem)

Edit: Rozwiązanie: podaj ścieżkę przy zapisie mnie nie zadowala.
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez Cyfrowy Baron » sobota, 7 sierpnia 2010, 20:11

Coś tutaj pokręciłeś! :o

ścieżka do programu:


Jak rozumiem chcesz przez to powiedzieć, że program umieściłeś w lokalizacji: C:\Documents and Settings\Przemek\Desktop\New Folder (3)\Stringi, a od kiedy to programy umieszcza się na pulpicie: C:\Documents and Settings\Przemek\Desktop\.

Zawsze to powtarzam, że należy podawać zawsze bezwzględną ścieżkę dostępu, ale nic nie stoi na przeszkodzie, żeby bezwzględna ścieżka dostępu była względna, względem programu.

Proponuję coś takiego:

KOD cpp:     UKRYJ  
  String dir = ExtractFilePath( ParamStr(0) );
  ofstream plik;
  plik.open( (dir + "aktualny.txt").c_str() ); // c_str() dla c++builder poniżej wersji 2009, powyżej t_str()


Dzięki pobraniu ścieżki dostępu do programu, program nigdy jej nie zgubi, ale jeżeli program znajduje się na pulpicie to plik też będzie na pulpicie.
Jeżeli to nie rozwiązuje Twojego problemu to opisz go dokładniej.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez politech » sobota, 7 sierpnia 2010, 23:11

Dzieki dokładnie o to mi chodziło.
Mam jeszcze inne pytanie:
napsialem maly generator imion:
KOD cpp:     UKRYJ  
String  generator(){
String final;
char *tab[]=
{//czesci imion};
char *end[]={//czesci imion};
do{
final="";
srand ( time(NULL) );
int i = rand()% 370;
i++;
int i2 = rand()% 370;
i2++;
int x=rand()% 310;
x++;
int x2=rand()% 310;
x2++;

final+=tab[i];
final+=end[x];
final+="+";
final+=tab[i2];
final+=end[x2];
}
while(final.Length()>30);
return final;


używam go w pętli:
KOD cpp:     UKRYJ  
 list<skrzynka>::iterator i;
   list<AnsiString>::iterator k;
   i=klasa.begin();
   k=serv.begin();
   AnsiString z;
   while (i!=klasa.end()){
    i->serv=*k;
    z=generator();
    i->imie=z;
    i++;k++;
    serv.pop_front();

   }


problem: kiedy debuguje tą pętle krok po kroku ładnie wypełnia mi wygenerowanymi imionami ale kiedy puszczam ja normalnie to generuje tylko 1 imię(tzn generator zwraca ciągle to samo imię)

Nie zakładałem nowego topiku bo nie chce zaśmiecać forum tematami z pojedynczymi pytaniami
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez Cyfrowy Baron » niedziela, 8 sierpnia 2010, 08:40

Problemem jest prawdopodobnie generator liczb rand(). Pomiędzy kolejnymi losowaniami powinna nastąpić chwila przerwy i tak się dzieje gdy debugujesz kod, czyli między jednym krokiem a drugim jest wystarczająca przerwa by generator mógł wylosować nową liczbę. Po pierwsze powinieneś uruchomić generator liczb (nie Twój lecz ten z bibliotek builder'a) już na starcie programu:

KOD cpp:     UKRYJ  
void __fastcall TForm1::FormShow(TObject *Sender)
{
 randomize();
}


Po wtóre w twojej funkcji generator powinna być przerwa między kolejnymi losowaniami, może tak:

KOD cpp:     UKRYJ  
int i = rand()% 370;
Sleep(10);
i++;
int i2 = rand()% 370;
Sleep(10);
i2++;
int x=rand()% 310;
Sleep(10);
x++;
int x2=rand()% 310;
x2++;
 


Być może opóźnienie powinieneś wprowadzić w pętli while (i!=klasa.end()).



Nie twórz wątków tasiemców! Nowy problem - nowy wątek!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez polymorphism » niedziela, 8 sierpnia 2010, 11:20

Cyfrowy Baron napisał(a):Problemem jest prawdopodobnie generator liczb rand(). Pomiędzy kolejnymi losowaniami powinna nastąpić chwila przerwy (...)

Niech po prostu wyrzuci wywołanie srand poza obie pętle ;)

Zastanawiają mnie te postinkrementacje indeksów. Ilu elementowe są tab i end?


________________
p.s. politech, jak wklejasz kod, to go wpierw sformatuj (chodzi o wcięcia), bo się czytać nie da :(
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez Cyfrowy Baron » niedziela, 8 sierpnia 2010, 15:09

Niech po prostu wyrzuci wywołanie srand poza obie pętle ;)


Czy to coś da skoro losuje funkcja rand():

KOD cpp:     UKRYJ  
int i = rand() % 370;
    i++;

int i2 = rand() % 370;
    i2++;

int x = rand() % 310;
    x++;

int x2 = rand() % 310;
 

Czterokrotnie losowana jest liczba i zapamiętywana w zmiennych, ale skoro losowanie odbywa się niemal jednocześnie (jedna funkcja za drugą) to czy nie zostanie wylosowana ta sama liczba?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez polymorphism » niedziela, 8 sierpnia 2010, 22:12

Czy to coś da skoro losuje funkcja rand():
(...)

Da, ponieważ srand inicjuje generator liczb (pseudo)losowych. Powyższym przypadku każde wywołanie tej funkcji "zeruje" generator, co skutkuje tym, że liczby są losowane od nowa. Od nowa, bo seed będzie ten sam (wszak odstępy czasowe są zbyt małe), więc i losowane liczby będą te same...

rand tak naprawdę niczego nie losuje, tylko wylicza kolejną liczbę według jakiegoś algorytmu, którego jedną z wartości początkowych jest właśnie seed podany funkcji srand.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez politech » niedziela, 8 sierpnia 2010, 23:04

nie występowało przekroczenie indeksów tablic poprzez inkrementacje, a byłą ona zrobiona aby nie wylosowalo 0(w związku z błędym założeniem, że tablice w c++ indeksowane są od 1) i już to poprawiłem.

Sposób barona działa swoją drogą zaraz sprawdze ten drugi.
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 sierpnia 2010, 09:45

rand tak naprawdę niczego nie losuje, tylko wylicza kolejną liczbę według jakiegoś algorytmu, którego jedną z wartości początkowych jest właśnie seed podany funkcji srand.


Zgadza się dlatego sugerowałem wprowadzenie opóźnienia pomiędzy kolejnymi wywołaniami tej funkcji. Nie jest to rozwiązanie optymalne, gdy wartość opóźnienia jest zawsze ta sama. By to urozmaicić można by losować wartość opóźnienia np. z zakresu 5 - 15.

Wprowadzanie opóźnienia nie jest dobrym rozwiązaniem, gdyż sztucznie wydłuża czas działania kodu. Ja szukałbym innego prostszego, ale skuteczniejszego rozwiązania.



Da, ponieważ srand inicjuje generator liczb (pseudo)losowych.


Dlatego sugerowałem uruchomienie generatora raz na starcie programu: randomize();
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez polymorphism » poniedziałek, 9 sierpnia 2010, 09:46

Sposób barona działa (...)

To oczywiste, że sposób Barona działa, ponieważ srand będzie wywoływane w większych odstępach czasowych, a co za tym idzie za każdym razem seed będzie inny (więc i liczby losowane też). Tyle że sposób ten rozwiązuje na okrętkę problem niewłaściwego użycia funkcji srand.

Tu masz z dokumentacji:

Two different initializations with the same seed, instructs the pseudo-random generator to generate the same succession of results for the subsequent calls to rand in both cases

.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez Cyfrowy Baron » poniedziałek, 9 sierpnia 2010, 09:55

Tyle że sposób ten rozwiązuje na okrętkę problem niewłaściwego użycia funkcji srand.


Wydaje mi się, że nie na tym polega problem. Nie chodzi o to, że w każdym obiegu pętli while:

KOD cpp:     UKRYJ  
while (i!=klasa.end())
{
    i->serv = *k;
    z = generator();

    i->imie = z;
    i++;
    k++;

    serv.pop_front();
 
losowane są te sam wartości, lecz o to, że funkcja rand() jest wywoływana wewnątrz jednej funkcji czterokrotnie raz za razem, przez co czterokrotnie zwraca tą samą liczbę. Co do srand to zgadzam się, że powinna znajdować się poza funkcją, najlepiej wywołać ją na starcie programu i nie zerować, aż do jego zamknięcia.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez polymorphism » poniedziałek, 9 sierpnia 2010, 10:13

(...) lecz o to, że funkcja rand() jest wywoływana wewnątrz jednej funkcji czterokrotnie raz za razem, przez co czterokrotnie zwraca tą samą liczbę.

To nie ma żadnego znaczenia! Funkcja rand za każdym razem zwróci inną liczbę. Problem polega na tym, że co każdą iterację pętli (generator) reinicjuje generator liczb losowych z tym samym seedem, przez co, co każdą iterację losuje dokładnie te same liczby.

Dla jasności przekazu:
KOD cpp:     UKRYJ  
/***** losuje 100 razy po trzy różne liczby *****/
srand(1);

for(int i = 0; i < 100; ++i)
    cout << rand() << ',' << rand()  << ',' << rand() << '\n';


/***** 'losuje' 100 razy tę samą trójkę liczb *****/
for(int i = 0; i < 100; ++i)
{
    srand(1);
    cout << rand() << ',' << rand()  << ',' << rand() << '\n';
}

Mam nadzieję, że już wszystko jasne...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Dziwny Folder docelowy zapisu pliku

Nowy postprzez politech » poniedziałek, 9 sierpnia 2010, 18:04

poklepałem troche kodu i kiedy wywaliłem sranda przed pętle:
KOD cpp:     UKRYJ  
 srand ( time(NULL) );
   while (i!=klasa.end()){
    i->serv=*k;
 

    z=generator();
    i->imie=z;
    i++;k++;
    serv.pop_front();

   }

wszystko działa poprawnie
Avatar użytkownika
politech
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): poniedziałek, 26 lipca 2010, 13:21
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder 2006
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 19 gości

cron