[C++ Builder] Problem z zapisywaniem i wczytywaniem z pliku przy zamykaniu przez system


(Igorbugajski2) #1

Witam.

Robię w C++ Builderze programik, który ma zliczać, ile siedzę przed komputerem, ale mam pewien problem.

Otóż według tego, co zrobiłem, jedyną możliwością wyłączenia programu jest zamknięcie systemu bądź wyłączenie go przez menadżera zadań. Coś mi nie działa na operacjach z plikiem przy zamykaniu w ten sposób, ale nie wiem, co dokładnie. Wczoraj program naliczył mi ok. 5h, ale dzisiaj, jak włączyłem komputer, licznik się wyzerował.

Nie mam żadnego pomysłu, co może powodować problem, więc po prostu wstawię tu cały Unit1.cpp:

(program jest przeznaczony tylko dla mnie, dlatego też ścieżka do pliku jest podana w ten sposób)

//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
Tokno *okno;
 
int sekd;
FILE * plik;
 
//---------------------------------------------------------------------------
__fastcall Tokno::Tokno(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall Tokno::Timer1Timer(TObject *Sender)
{
        plik = fopen("C:\\Users\\GOKOP\\Documents\\NoLifeCounter\\sek_komp", "w");
        fscanf(plik, "%u", &sekd);
 
        int s, m, h;
        AnsiString sek, min, godz;
 
        h = sekd / 3600;
        godz = IntToStr(h);
 
        m = (sekd - h * 3600) / 60;
        min = IntToStr(m);
 
        s = sekd - h*3600 - min*60;
        sek = IntToStr(s);
 
        licznik -> Caption = godz+"h "+min+"min "+sek+"s";
 
        sekd++;
 
        fprintf(plik, "%u", sekd);
 
        fclose(plik);
}
//---------------------------------------------------------------------------
void __fastcall Tokno::FormClose(TObject *Sender, TCloseAction &Action)
{
        Action = caNone;
        okno -> Hide();
}
//---------------------------------------------------------------------------
 
void __fastcall Tokno::TrayIcon1Click(TObject *Sender)
{
        okno -> Show();
        Application->BringToFront();
}
//---------------------------------------------------------------------------

(Jim1961) #2

spróbuj zamienić:

fopen("...", "w");

na:

fopen("...", "r+");

(Igorbugajski2) #3

Tak miałem wcześniej, ale wtedy liczba sekund była zapisywana jedna po drugiej, a nie była zastępowana.


(Jim1961) #4

No to może:

plik = fopen("...", "r");
fscanf(plik, "%u", &sekd);
freopen("...", "w", plik);
fprintf(plik, "%u", sekd);
fclose(plik)

??


(Igorbugajski2) #5

Wydaje mi się, że działa, dzięki, w razie czego napiszę.