Problem z ofstream i zapisem za pomocą SaveDialog

dział ogólny

Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez simekone » sobota, 23 maja 2009, 11:19

Mam taki kod do zapisu pliku za pomocą ofstream:

Kod: Zaznacz cały
if(SaveDialog1->Execute()) {
...
ofstream outfile;
outfile.open(SaveDialog1->FileName.c_str(), ios::binary);
outfile << linia1.c_str() << endl;
outfile << linia2.c_str() << endl;
outfile << linia3.c_str() << endl;
outfile << linia4.c_str() << endl;
outfile.close();
}


Plik zapisuje się bez problemu lecz po zamknięciu programy w BCB pojawia się komunikat:
Obrazek
Niezależnie od tego co wybiorę proces EXEeka projektu jest cały czas uruchomiony nie mogę go zamknąć za pomocą menadżera. Aby ponownie skompilować program muszę uruchomić ponownie BCB.

Wszystko działało bez problemu gdy do zapisu używałem do zapisu kodu:
Kod: Zaznacz cały
outfile.open("C:\\test.txt", ios::noreplace);
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez Corvis » sobota, 23 maja 2009, 11:42

a te zapisywanie to gdzie jest realizowane ?? w jakiej metodzie
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez Cyfrowy Baron » sobota, 23 maja 2009, 13:41

Sprawdziłem ten kod u siebie i wszystko działa prawidłowo, wiec błędu nie wywołuje kod który tutaj przytoczyłeś, lecz to czego nie podałeś (to co wykropkowałeś).
Przytoczony fragment kodu działa prawidłowo, możesz to sprawdzić tworząc nowy projekt i umieszczając w nim taki oto prosty kod:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(SaveDialog1->Execute())
{
  ofstream outfile;
  outfile.open(SaveDialog1->FileName.c_str(), ios::binary);
  outfile << "linia1" << endl;
  outfile << "linia1" << endl;
  outfile << "linia1" << endl;
  outfile << "linia1" << endl;
  outfile.close();
}
}


To musi działać prawidłowo, chyba że używasz środowiska C++ Builder 2009.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez simekone » sobota, 23 maja 2009, 14:45

Cyfrowy Baron napisał(a):To musi działać prawidłowo, chyba że używasz środowiska C++ Builder 2009.


Tak własnie tego środowiska używam. Co mam zrobić w tym wypadku?
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez banita » sobota, 23 maja 2009, 15:02

w bcb 2009 metoda c_str() zwraca wchar_t* czyli UNICODE. sproboj uzyc t_str() ktora zwraca lancuch znakow w postaci char*

tak na marginesie to bcb posiada wlasne klasy do pracy z plikami ktore znaczenie lepiej wspolpracuja z vcl niz te z stl-a
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez simekone » sobota, 23 maja 2009, 15:29

banita napisał(a):w bcb 2009 metoda c_str() zwraca wchar_t* czyli UNICODE. sproboj uzyc t_str() ktora zwraca lancuch znakow w postaci char*

tak na marginesie to bcb posiada wlasne klasy do pracy z plikami ktore znaczenie lepiej wspolpracuja z vcl niz te z stl-a


Po użyciu t_str() nadal jest ten sam problem. Nie ma problemu z użyciem innej klasy, niestety umiem korzystać jedynie z fstream do zapisu i odczytu plików.
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez banita » sobota, 23 maja 2009, 15:50

blad nie lezy w tym kodzie. sprawdzilem na bcb 2009 i wszystko dziala poprawnie.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez simekone » sobota, 23 maja 2009, 16:09

banita napisał(a):blad nie lezy w tym kodzie. sprawdzilem na bcb 2009 i wszystko dziala poprawnie.


Wszystko działa także gdy użyje zapisu do określonej ścieżki, więc błąd lezy w użyciu SaveDialog. Spróbowąłem także uzyc FileSaveDialog, ale problem jest taki sam.
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez banita » sobota, 23 maja 2009, 16:16

spakuj ten projekt i zalacz tutaj.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez simekone » sobota, 23 maja 2009, 16:17

Znalazłem tematy na różnych forach na ten temat:
https://forums.embarcadero.com/thread.j ... eID=111037
https://forums.codegear.com/thread.jspa?threadID=13634
http://social.technet.microsoft.com/For ... f=required

Wynika z tego, że to błąd Win 7... Bardzo intrygujące, może ktoś wyczyta więcej.
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez banita » sobota, 23 maja 2009, 16:21

jezeli piszesz pod system ktory nie zostal publicznie oddany do uzytku, w narzedziu ktore oficjalnie nie wspiera tego systemu to musisz liczyc sie z roznymi kwiatkami. nauka programowania w ten sposob to bardzo zly pomysl.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez simekone » sobota, 23 maja 2009, 16:30

banita napisał(a):jezeli piszesz pod system ktory nie zostal publicznie oddany do uzytku, w narzedziu ktore oficjalnie nie wspiera tego systemu to musisz liczyc sie z roznymi kwiatkami. nauka programowania w ten sposob to bardzo zly pomysl.


Niestety zmusiła mnie do tego sytuacja, korzystam z darmowej bety, ponieważ muszę poczekać na mój klucz do visty z uczelni.
Avatar użytkownika
simekone
Bladawiec
Bladawiec
 
Posty: 31
Dołączył(a): środa, 25 marca 2009, 13:27
Podziękował : 1
Otrzymał podziękowań: 0
Kompilator: CodeGear C++ Builder 2009
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez Cyfrowy Baron » sobota, 23 maja 2009, 19:33

Wynika z tego, że to błąd Win 7... Bardzo intrygujące, może ktoś wyczyta więcej.

To nie jest błąd systemu, tylko problem z przywilejami dostępu. Z tego na ile zdążyłem się zorientować, to Vista jak i Win 7 wymagają by do programu dodawać manifest z jakimiś wpisami umożliwiającymi programowi dostęp do plików z uprawnieniami administratora. Nie zagłębiałem się w te temat, gdyż ja używam WinXP i Ci dla których piszę czasami programy, również korzystają z WinXP, więc myślę, że jeżeli nic się nie wydarzy to o Viście można już zapomnieć, tak jak kiedyś o Windows Millennium, a co do Win 7, to trzeba jeszcze poczekać coś ze 2 lata, zanim to się rozpowszechni (jeżeli wogóle...) na dobre.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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
    NieznanyNieznana

Re: Problem z ofstream i zapisem za pomocą SaveDialog

Nowy postprzez Miroo_007 » poniedziałek, 25 maja 2009, 01:15

simekone napisał(a):Nie ma problemu z użyciem innej klasy, niestety umiem korzystać jedynie z fstream do zapisu i odczytu plików.

Kod: Zaznacz cały
//------------Zapis danych do pliku za pomocą VCL------------------------
if(SaveDialog1->Execute()) {
    TFileStream *FStream;
    try {
        FStream = new TFileStream(SaveDialog1->FileName, fmCreate);
        FStream->WriteBuffer(&linia1.c_str(), sizeof(linia1.c_str());
        FStream->WriteBuffer(&linia2.c_str(), sizeof(linia2.c_str());
        FStream->WriteBuffer(&linia3.c_str(), sizeof(linia3.c_str());
        FStream->WriteBuffer(&linia4.c_str(), sizeof(linia4.c_str());
    }
    __finally {
        delete FStream;
    }
}

Ewentualnie można wykorzystać coś takiego:
Kod: Zaznacz cały
if(SaveDialog1->Execute()) {
    TFileStream *FStream;
    try {
        FStream = new TFileStream(SaveDialog1->FileName, fmCreate);
        FStream->WriteComponent(Memo1);
        FStream->WriteComponent(Edit1);
    }
    __finally {
        delete FStream;
    }
}
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana


  • 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 13 gości

cron