• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego dane nie chcą się zapisać do pliku .txt

Object Storage Arubacloud
0 głosów
569 wizyt
pytanie zadane 27 grudnia 2015 w C i C++ przez KlataMiLata Bywalec (2,120 p.)

Napisałem tako oto metodę do zdarzenia FormClose w C++ Builderze 

plik.open("Licznik.txt",  ios::out) ;
                        plik<<s;
                        plik.close();

Jednak dane nie chcą się zapisywać potrzebuję pomocy. Zmienna s jest typu int.

2 odpowiedzi

0 głosów
odpowiedź 27 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
Podaj logi kompilacji - trudno cokolwiek stwierdzić, gdyż sam kod jest nawet poprawny.
komentarz 27 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
Dopiero zaczynam pracę w c++ builderze i nie za bardzo orientuje się, gdzie takowe występują. Mógłbym prosić o małą sugestie ?
komentarz 27 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli program ci się kompiluje, to nie musisz mi ich podawać. A tak poza tym, to w czym problem? Plik pozostaje bez zmian? I czy w ogóle ten plik istnieje przed zapisem?
komentarz 27 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
Program kompiluje się. Plik gdy nie istnieje zostaje stworzony, jednak testuje na stworzonym pliku. Wartość zmiennej s jednak nie zapisuje się w pliku. Plik zostaje nadpisany jednak pustą kartką, czyli pomimo wpisania do niego wartości po zakończeniu zauważamy, że jej tam nie ma. Chcę aby wartość była nadpisywana z każdym zamknięciem programu.
komentarz 27 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
Podaj dokładny kod, najlepiej cały, gotowy program. Spróbuję wtedy przeanalizować, gdzie leży problem.
komentarz 27 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
edycja 27 grudnia 2015 przez KlataMiLata

Wysyłam cały plik .cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <cstdlib.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;

        int s=0;
        string dane;
         fstream plik;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   s++;
   int godzin,minut,sekund;
   AnsiString godz,min,sek;

   godzin = s/3600;
   godz=IntToStr(godzin);
   if(godz<10)
   {
   godz="0"+godz;
   }
   minut = (s-godzin*3600)/60;
   min=IntToStr(minut);
   if(min<10)
   {
   min="0"+min;
   }
   sekund = s-godzin*3600 - minut*60;
   sek=IntToStr(sekund);
   Label1->Caption=godz +":"+min+":"+sek;
   if(sek<10)
   {
   sek="0"+sek;
   }


}
//---------------------------------------------------------------------------



void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{
        Show();
        Application->BringToFront();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        if(Application->MessageBoxA("Czy zamknąc program?", "Potwierdź",
         MB_YESNO | MB_ICONQUESTION) == IDNO)
        {
                Action=caNone;
        }
        else
        {
                plik.open("Licznik.txt", ios::out ) ;
                plik<<s;
                plik.close();
        }
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
       
        plik.open("Licznik.txt", ios::in) ;
        if(plik.good()==false){
        (Application->MessageBoxA("Program utworzy nowy plik (.txt),w którym przechowa twoje dane.", "Potwierdź", MB_OK | MB_ICONASTERISK) );}
        else{
        getline( plik, dane );
        s = atoi(dane.c_str()) ;}
}
//---------------------------------------------------------------------------

Używam string-ów, a nie AnsiStringów gdyż niektóre funkcje nie współpracują z tymi drugimi.

komentarz 27 grudnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
Nie posiadam, niestety, C++ Builder'a, więc nie mogę wypróbować twojego programu, ale wnioskuję, że problem może leżeć w warunku - możliwe, że się nie spełnia. Sprawdź to, np. wypisując coś na ekranie.
komentarz 28 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Nie mam możliwości tego przestestować w C++ Builder, więc niech autor postu sprawdzi moje przypuszczenia. Czy przypadkiem nie jest konieczne zamknięcie pliku (strumienia do pliku) przed zmianą jego przeznaczenia (ze strumienia wejściowego na wyjściowy albo odwrotnie) i ponowne jego otwarcie z nowym przeznaczeniem.
W kodzie występuje sytuacja, że strumień jest otwierany jako wejściowy przy zdarzeniu OnCreate(), a następnie jest używany przy OnClose() wtedy jako strumień wyjściowy. Po użyciu jako strumień wejściowy jest "w biegu" zamieniany na strumień wyjściowy i dopiero wtedy zamykany. Czy nie należałoby po użyciu go jako strumień wejściowy, zamknąć i przy użyciu jako strumień wyjściowy ponownie otworzyć z nowymi ustawieniami (jako wyjście)?
komentarz 28 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
Tak jest to poprawny zapis. Jednak i bez tego program kompiluje się. Niestety nie jest to przyczyną problemu, ponieważ on  dalej istnieje i program liczy za każdym razem od wartości zerowej.
komentarz 28 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Zbierając do kupy. W momencie otwarcia aplikacji, z pliku tekstowego pobierasz zapisaną tam liczbę, przypisujesz ją do zmiennej s i inkrementujesz co cykl Timera. Przy zamykaniu aplikacji zapisujesz jej aktualny stan do pliku tekstowego. Tak ma to mniej więcej wyglądać? Sorry, za takie głebokie dedukcje;), ale późno jest.
Problem jest z tym, że zmienna s jest inkrementowana od zera, a nie od wartości zapisanej przy ostatnim zamknięciu apki, np. 66?
Sprawdziłeś to co sugerowałem w ostatnim komentarzu, tzn. w OnCreate() po zakończeniu wczytania danych danych z pliku, zamknięcie strumienia?
komentarz 28 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
Tak jest dokładnie tak jak Pan mówi. Poprawiłem już zdarzenie OnCreate o linie plik.close();, jednak nic się nie zmienia.
komentarz 28 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
W pliku tekstowym jest jakaś sensowna wartość? Nie ma w nim nic? Wartość jest zupełnie od czapy?
komentarz 28 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
Plik ma zawierać tylko liczbe sekund, która upłyneła od uruchomienia do ostatniego zakończenia programu.
komentarz 28 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
To ciekawe...
Dopisz do OnCreate(), wyświetlenie tego co wczytano z pliku na Label, żeby było wiadomo, co wczytuje z pliku przy uruchomieniu.
komentarz 28 grudnia 2015 przez KlataMiLata Bywalec (2,120 p.)
To nie w OnCreate() jest problem bo wartości są pobierane poprawnie. Przy zamknięciu programu, wartość zmiennej s nie chce się nadpisywać w pliku. Program kończy się, a w pliku zamiast wcześniej wpisanej wartości nie ma nic.
komentarz 28 grudnia 2015 przez Krawiec91 Pasjonat (19,600 p.)
Ok, czyli pobieranie w porządku. W OnClose() wykomentuj wszystko poza obsługą strumienia i zobacz czy to coś zmieni.
0 głosów
odpowiedź 1 grudnia 2017 przez Marek Smętek 1 Nowicjusz (220 p.)
Napisz przed tym:

 

ifstream plik;

Podobne pytania

0 głosów
1 odpowiedź 436 wizyt
pytanie zadane 19 października 2015 w C i C++ przez kwiats Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 355 wizyt
0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 1 stycznia 2016 w C i C++ przez timrh Mądrala (6,030 p.)

92,617 zapytań

141,466 odpowiedzi

319,783 komentarzy

61,999 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...