[C++]Wykonanie funkcji "shutdown" - DOS


(Davis1611) #1

Witam, mam problem. Chce zrobić program, który będzie pobierał ilość sekund do zamknięcia komputera od użytkownika, a potem wykonywał polecenie "shutdown -s -t [tutaj_zmienna_int_od_usera]"

Napisałem coś takiego:

#include 

#include 


using namespace std;


int main()

{

  cout<<"Podaj czas do wylaczenia: ";

  int czas;

  cin>>czas;

  system("shutdown -s -t "+czas);

  getch();

  return(0);

}

Lecz po użyciu wyświetla się, że nazwa katalogu lub składnia etykiety woluminium jest nie poprawna, choć jak piszę dokładnie to samo w konsoli to działa.

Dodam jeszcze, że gdy wpiszę ręcznie czas, a program nie będzie pobierał danych, tylko wyświetlał komunikat, to cały czas komunikat sie wyświetla i nic się nie dzieje.

Proszę o pomoc, co robię źle.

Chciałbym jeszcze zaznaczyć, że w C++ "programuje" 2 dzień = jestem początkujący.

edit1

Zauważyłem teraz, że gdy wpisze na przykład "90", to pisze: "Dysk nie został odnaleziony", a gdy inne cyfry, to np. "Polecenie "suopr" nie zostało odnalezione[...]". Czy to chodzi o typ zmiennej? Wydaje mi się, że int to doby typ, bo za pomocą cout wyświetla dobrą cyfre, a nie zamienia na inne znaki.

Pozdrawiam, Snejk.


(Kalin 93) #2

Czemu początkujący, nie zaczną od poczytania kursu, napisania jakiegoś kalkulatora, nauczą się operować stringami, tablicami a dopiero potem biorą się za programy które wymagają już jakiejś wiedzy ? :wink:

Użyj stringów, jednemu nadaj wartość "shutdown -s -t " i dodaj potem tą zmienną int, być może będzie potrzebny stringstream ale powinien wystarczyć operator ">>". :wink:

Powodzenia...


(Davis1611) #3

Ehh..

Nie mogę sobie poradzić z tym, a zależy mi na szybkim rozwiązaniu problemu. Próbowałem ">>" i "stringstream", ale nie moge coś zrobić. Mógł byś mnie troche pokierować? :stuck_out_tongue:

Pozdrawiam.


(Kalin 93) #4

A jak użyłeś operatora >> ?

Według mnie powinno być

int >> string

Ale nie sprawdzałem tego, ewentualnie nie wczytuj do INT ale do stringu, będzie szybciej i łatwiej :wink:

Potem już tylko np sPolecenie = sPolecenie + sCzas i już :wink:

Oczywiście sPolecenie musi mieć wartość "shutdown -s -t " (spacja jest ważna !).

No teraz już powinieneś dać sobie radę :wink:


(Kamil Wojtasik) #5

nie wiem czy zadziała ale spróbuj

System_support("shutdown -s -t %d",700);

void System_support(char* command,...)

{

system(command);

}

(Davis1611) #6

To nie działa, program już pobiera wszystko i jest dobrze i zawsze jak jest dobrze wyświetla ostatni tekst, który był podany wyżej w cout. Może są jakieś inne polecenia, oprocz system?

Btw. KaMiLLOoO ta funkcja, którą ty podałeś to jest to samo co samo system, przynajmniej to wnioskuje po błędnym użyciu funkcji system, która jaką błąd zwróciła, że musze użyc char.


(Kalin 93) #7

Może pokaż cały kod programu ...


(Davis1611) #8
#include 

#include 


using namespace std;


void System_support(char* command,...)

{

system(command);

}


int main()

{

  cout<<"Podaj czas do wylaczenia: ";

  char czas[4];

  cin>>czas;

  System_support("shutdown -s -t %d",czas);  

  getch();

  return(0);

}

Metodą pana KaMiLLOoO I "zwyczajnie"

#include 

#include 


using namespace std;


int main()

{

  cout<<"Bye";

  system("shutdown -s -t 60");  

  getch();

  return(0);

}

Która działa jak

#include 

#include 


using namespace std;


int main()

{

  while(true)

  {

    cout<<"Bye";

  }

  return(0);

}

tylko z małym opóźnieniem po "cout<<"Bye";" Nie wiem dlaczego nie działa, inne funkcje działają (typu start http://google.ru).


(Kalin 93) #9
#include 

#include 


using namespace std;


int main()

{

string sPolecenie = "shutdown -s -t ";

string sCzas;

getline (cin, sCzas);

sPolecenie = sPolecenie + sCzas;

system (sPolecenie.c_str());

}

Ostatni raz robię coś dla kogoś ... Nie sprawdzałem ale powinno działać ...

EDIT : Sprawdziłem, działa ... Mam nadzieję że pomogłem, choć na przyszłość staraj się rozwiązywać problemy samemu zaczynając od prostszych programów :wink:


(Davis1611) #10

O! Próbowałem wcześniej podobnie, inne nazwy zmiennych i nadal nie działa. W tym kodzie jak wpisze, np. 60 to zchodzi linijke nizej i dalej moge pisac co wy chodzi na to, że zawsze wywołuje się funkcja getline. Nie rozumie co tu nie działa :confused:


(Kalin 93) #11

Yyy ... Przecież u mnie to działa, w czym to kompilujesz ?


(Davis1611) #12

Dev-Cpp, nie wiem dlaczego by miało nie działac? Inne komendy dosowe działają.

Btw. jak by takei coś działało to nie było by tematu bo próbowałem.


(Fiołek) #13

To nie są komendy DOS-owe, tylko Windowsowe.

kalin93 ma całkowitą rację, Tobie brakuje PODSTAW! W każdym porządnym tutorialu/książce jest napisane, że cudzysłów tworzy C-string, czyli const char *, a jak powinieneś wiedzieć(choć wątpię w to) jeśli doda się do niego operatorem jakiś typ, to tylko przesuwany WSKAŹNIK o tyle bajtów ile było podane w tym incie.

Obrazowo:

const char* tmp = reinterpret_cast(0); //Ustawiamy wskaźnik na 0(NULL).

std::cout << reinterpret_cast(tmp); //Wypisze 0 jako iż wskaźnik wskazuje na ten bajt.

int offset = 10; //Przykładowy offset.

tmp = tmp + offset; //Do WSKAŹNIKA dodajemy offset.

std::cout << reinterpret_cast(tmp); //Wypisze 10 jako iż przesunęliśmy WSKAŹNIK o 10 bajtów.

Tak przedstawia się Twój błąd. Rozwiązanie jakie podał kalin93 jest jak najbardziej poprawne.


(Davis1611) #14

A czy ja mówie, że jest nie poprawne? Nie działa i tyle :S


(Fiołek) #15

Musisz coś źle robić, bo skopiowane i skompilowane działa jak należy.


(Quba 2) #16

Przecież można to zrobić tak prosto jak zaczął Davis1611

troszkę zmieniłem kod i wszystko działa jak należy

#include 

#include 

using namespace std;


int main()

{

  cout<<"Podaj czas do wylaczenia: ";

  char czas[100];

  char shut[120]="shutdown -s -t ";

  cin>>czas;

  strcat(shut,czas);

  system(shut);

  getch();

  return(0);

}

(Fiołek) #17

Przykro mi, ale bardziej zagmatwałeś kod. Po co zaprzęgać do tego funkcje do operacji na c-stringach, jeśli można użyć zgrabnej klasy std::string. Jest mniej kodu i dzięki temu jest on czytelniejszy. Do tego mieszamy funkcje z C ze strumieniami C++ co uważam(w tym wypadku) za głupotę.


(fiftygrosh) #18

luuudzie... ręce opadają...

zamień to:

system("shutdown -s -t "+czas);

na to:

system("shutdown -s -t "<

i cała filozofia

nauczcie się ludzie operatorów z c++...


(Fiołek) #19

@ fiftygrosh : i tym sposobem pokazałeś, że nie znasz operatorów C++ :wink:

Operator << to przesunięcie bitowe w lewo, czyli wychodzi na to, że przesuwasz ADRES WSKAŹNIKA o czas bitów w lewo :wink: To nie jest przeładowany operator strumieni, to zwykły operator arytmetyczny.


([alex]) #20

Chyba się domyślam czemu koledze Davis1611 nie działa,

pewnie próbuje odpalić:

program 30

Jeżeli o to chodzi to:

#include 

#include 


using namespace std;


int main(int n,char *p[])

  {

   string sPolecenie=(n>1?string("shutdown -s -t ")+p[1]:"shutdown -s");

   system (sPolecenie.c_str());

   return 0;

  }