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

Problem z plikami tekstowymi

VPS Starter Arubacloud
+1 głos
227 wizyt
pytanie zadane 27 stycznia 2016 w C i C++ przez Kimi Bywalec (2,050 p.)

Witam, zaczynam swoją nauke C++. Postanowiłem napisać program który pokazuje nam ile działa nasz komputer. Program działa, jednak chciałem zrobić tak aby wynik był zapisywany do pliku tekstowego aby mieć tygodniowy pogląd. Jedyny problem jest taki że gdy napisałem cina który ma być informacją dla kodu który zapisuje dane do pliku program ciągle pokazuje 0 zamiast działac poprawnie, oto kod:

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <fstream>
using namespace std;
int minuty;
int ciin;
int main()

{



    for (int i=0; i<=36000; i++)
    {
        Sleep (60);
        system("cls");
        cout<<"Twoj komputer dziala"<<endl;
        cout<<i<<"Minut"<<endl;
        if(i>60)
        {
            cout<<"twoj komputer dziala"<<endl;
            cout<<i/60<<"godzin";
        }
        cin>>ciin;

    }

fstream t;
t.open("minuty.txt",ios::out|ios::app);
t<<ciin<<endl;
t.close();
    return 0;

}

 

2 odpowiedzi

+1 głos
odpowiedź 27 stycznia 2016 przez draghan VIP (106,230 p.)

Witaj.

program ciągle pokazuje 0

To znaczy...? Gdzie pokazuje Ci to zero? I do czego konkretnie potrzebna Ci zmienna ciin, bo nie mogę zrozumieć?

A tak poza tym, do funkcji Sleep() podajemy ilość milisekund, a nie minut ;)

komentarz 27 stycznia 2016 przez Kimi Bywalec (2,050 p.)

Wiem że miliseknund :) Jednak nie będe czekał minuty dla testu. 

Gdy odpalam program bez cin>>ciin; działa tak jak powinien czyli normalnie pokazuje czas jednak z nią stoi na 0. 

Może że >>ciin jest nie potrzebna, jednak wydaje mi się zę jest ona końieczna do zapisu do pliku tekstowego a dokładniej tutaj:

t<<ciin<<endl;

Jednak mogę się mylić bo jak mówiłem jestem świeżakiem

komentarz 27 stycznia 2016 przez draghan VIP (106,230 p.)

Stoi na zero, ponieważ zapisałeś cin>>ciin;, co oznacza, że program czeka aż wprowadzisz z klawiatury liczbę. ;)

Co chcesz mieć zapisane w tym pliku tekstowym?

komentarz 27 stycznia 2016 przez Kimi Bywalec (2,050 p.)
Wartość którą otrzyma program po wyłączeniu go czyli czas ile program był włączony.
komentarz 27 stycznia 2016 przez draghan VIP (106,230 p.)

To chcesz wpisać tam wartość i, a nie ciin. Wyjmij deklarację zmiennej i z pętli, żeby mieć do niej dostęp również poza pętlą i najzwyczajniej w świecie wpisz do pliku i.

    int i;
    for (i = 0; i<=36000; i++)
    {
        Sleep (60);
        system("cls");
        cout<<"Twoj komputer dziala"<<endl;
        cout<<i<<"Minut"<<endl;
        if(i>60)
        {
            cout<<"twoj komputer dziala"<<endl;
            cout<<i/60<<"godzin";
        }
        cin>>ciin;
 
    }
 
fstream t;
t.open("minuty.txt",ios::out|ios::app);
t<< i <<endl;
t.close();

 

komentarz 27 stycznia 2016 przez Kimi Bywalec (2,050 p.)
Ok. Wszystko działa! Dzięki wielkie, taki prosty i głupi błąd a jednak ;)
komentarz 27 stycznia 2016 przez draghan VIP (106,230 p.)
A, zapomniałem wyrzucić z kodu cin>>ciin - ale na pewno sam to zrobiłeś. ;)
komentarz 27 stycznia 2016 przez Kimi Bywalec (2,050 p.)

Widzę że jesteś bardziej doświadczony ode mnie. Zmodyfikowałem lekko kod. Zapisuje on końcowy wynik znaczy wtedy kiedy zakończe pętle jedyny problem to że zawsze zapisuje 0.

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <fstream>
#include <conio.h>
using namespace std;
int minuty;
int i;

int main()

{

    for (int i=1; i<=36000; i++)
    {

        Sleep (600);
        system("cls");
        cout<<"Twoj komputer dziala"<<endl;
        cout<<i<<"Minut"<<endl;
          if( kbhit() )
             if( getch() == 'q' ) break;
        if(i>60)
        {
            cout<<"Twoj komputer dziala"<<endl;
            cout<<i/60<<"godzin"<<endl;
        }
cout<<"Jesli chcesz zakonczyc program i rownoczesnie zapisac swoj wynik nacisnij Q";

    }

fstream t;
t.open("Program_Minutowy.txt",ios::out|ios::app);
t<<i;
t.close();
    return 0;

}

 

komentarz 27 stycznia 2016 przez draghan VIP (106,230 p.)

W swoim programie masz dwie zmienne "i" - jedna globalna, która domyślnie przyjmuje wartość 0 oraz druga, lokalna w pętli, którą inicjalizujesz zerem.

W pętli zmienna lokalna i przesłania zmienną globalną. Kiedy wychodzisz z pętli, zmienna lokalna jest niszczona. Tak więc globalną zmienną pozostawiasz nietkniętą podczas działania pętli, po czym - po zakończeniu pętli - zapisujesz ją do pliku.

Spójrz na mój kod wyżej, na konstrukcję pętli for - nie definiuję tam nowej zmiennej, tylko używam zdefiniowanej wcześniej. Specjalnie wyrzuciłem definicję przed pętlę.

Inna sprawa, to taka że po zakończeniu pętli, Twoje i będzie zawsze miało wartość 36000. I zawsze taką wartość wpiszesz do pliku.

Jeśli chcesz, żeby program wykonywał jakąś akcję (np. zapis do pliku) w momencie wyłączenia, masz do dyspozycji dwa sposoby.

Pierwszy, "w stylu C", za pomocą funkcji atexit(), przyjmującej wskaźnik na funkcję, którą zamierzasz wykonać.

Drugi - konstruując obiekt, który będzie żył aż do zakończenia programu, a niezbędne akcje wykona w destruktorze.

+1 głos
odpowiedź 27 stycznia 2016 przez Daaa22 Dyskutant (8,250 p.)

Zmotywowałeś mnie do zrobienia tego: http://speedy.sh/W3KPP/Wyswietlacz.exe

PS. Pomyśl, jak to zrobiłem i na pewno ci to pomoże przy robieniu własnego programu.

komentarz 27 stycznia 2016 przez draghan VIP (106,230 p.)

Całkiem w porządku. :) yes

Podobne pytania

0 głosów
1 odpowiedź 296 wizyt
–2 głosów
1 odpowiedź 215 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez julita998 Początkujący (250 p.)
0 głosów
2 odpowiedzi 143 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez trebuH Nowicjusz (170 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...