PDA

Prikaži potpunu verziju : konekcija u c-u (moze i c++) i...


barjaktar
10.4.2006, 17:22
Zanima me kako u c-u glasi naredba za uspostvljene internet konekcije preko modema, ako je u c++ - u drugacija, molim napisite i nju.
Takodje, ako neko zna, kako u c-u (ili c++ -u, nije bitno) prekopirati jedan tekstualni fajl u drugi, i zatim taj prvi izbrisati?
I jos jedno, kako c gasi racunar?

voodoo_
10.4.2006, 18:10
C/C++ ne može sam da gasi računar i da uspostavlja konekciju - za to moraš da pozoveš odgovarajuće Windowsove funkcije. Potraži na netu help fajl pod imenom "Win32 Programmer's Reference" (win32.hlp) i pogledaj opis funkcije ExitWindowsEx, a za konekciju malo googlaj.
Što se tiče kopiranja fajla, na Windowsu ti je najlakše da koristiš CopyFile funkciju, a za brisanje DeleteFile.

Oliver
10.4.2006, 18:17
Open Connection(dial ptt), Ha ha ha , malo sutra, treba ti malo više rada od jedne komande
Al za gašenje ćeš bolje proći, jedino ako ne praviš neki virus?
Otvaraš konekciju, gasiš komp i brišeš fajlove???? :dzavo:

MG-RAY
10.4.2006, 19:49
Pa mozes da koristis ExitWindowEx i InitiateSystemShutdown API (za gasenje), ali su oni, koliko ja znam, namenjeni za VC++ ...

sto se tice kopiranja txt fajlova:


# include <stdio.h>

void main()
{

FILE *f ;
char buf[100] ;
f = fopen("test.txt", "r+") // prvi deo funkcije je ime fajla,
// drugi deo - mod/tip otvaranja :
// w: write , r: read, r+: read/write*/

fgets(buf,sizeof(buf),f) ; // buffer (kao niz/matrica/array), njegova
//velicina i pointer na fajl.

fclose(f) ; //zatvara fajl

//fprintf(f,"Hello"); //pise podatke u fajl
}



pretpostavljam da znas sta treba da uradis sa ovim... :a_bleh:

NenadN
10.4.2006, 21:20
ExitWindowsEx ce da mu zadovolji potrebe, mada kod Win9x jedna linija gasi komp dok kod NT treba da dobije privilegije sa AdjustTokenPrivileges

priest (of_the_moon)
15.4.2006, 2:29
Da vidimo...
Za dial-up odličan link:
http://www.codeproject.com/internet/dialup.asp

Za shutdown u WinXp ovaj kod bi trebalo da šljaka posao:

int RebootWindows()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

ExitWindowsEx(EWX_REBOOT, 0); // EWX_FORCE, EWX_REBOOT, EWX_POWEROFF, EWX_LOGOFF, EWX_SHUTDOWN
return 0;
}

barjaktar
17.4.2006, 0:37
@priest, hvala, ovo je najpotpuniji odgovor, ali molim te hajde mi malo pojasni sta se desava u onom kodu, ako nije problem...

@mg-ray, kopirao sam tvoj kod (izgleda da nisam skontao ono "znas sta treba"...), ali mi linija

fgets(buf,sizeof(buf),f) ;

pravi problem pri kompajliranju:

syntax error before "fgets"

E sad da li sam ja glup ili sta, uglavnom, ne ide...
Da li mozda treba da ukljucim jos neku biblioteku pored stdio?

priest (of_the_moon)
17.4.2006, 15:28
Da bi tvoj proces tj. program mogao da izvrši funkciju ExitWindowsEx (koja u stvari gasi komp) njegov token mora imati određene privilegije. Token je objekat koji predstavlja nešto (neki proces recimo) u sistemu pristupa u WinNT arhitekturi. U ne-NT-u ovo sa token-om nije moralo da se radi zbog jednostavnijeg pomenutog sistema.
Sa prvom funkcijom se pristupa token-u tvog programa i dobijamo HANDLE (to znaš valjda šta je). Druga funkicja i sledeća dva reda popunjavaju TOKEN_PRIVILEGES strukturu (koja ke neophodna za rad sa priviegijama token-a) tako da token dobije privilegiju da gasi komp. U trećoj funkciji sve to lepo saopštimo OS-u (da naš token treba da ima te i te privilegije) unoseći HANDLE i TOKEN_PRIVILEGES.
Sad ostaje samo da se pozove ExitWindowsEx. Ostale vrednosti prvog parametra za tu funkciju sam komentovao, pa možeš tako upotrebiti "EWX_REBOOT" za reset, "EWX_FORCE | EWX_SHUTDOWN" za gašenje na silu (gašenje i ako to neki program ne dopušta) itd. Poslednje pažljivo koristi, jer iako će većina programa zaustaviti shutdown ako se zaglavi (not responding), neki će to uraditi iz sigurnosnih razloga (recimo ako ne snimiš neki dokumet na kome si radio).
Ako te neka funkcija/parametar posebno interesuje upotrebi google.

Brains
18.4.2006, 13:41
@mg-ray, kopirao sam tvoj kod (izgleda da nisam skontao ono "znas sta treba"...), ali mi linija
fgets(buf,sizeof(buf),f) ;
pravi problem pri kompajliranju:
syntax error before "fgets"
Covek je zaboravio ; u prethodnoj liniji koda. :kreza:
Znaci, umesto:
f = fopen("test.txt", "r+")
ide:
f = fopen("test.txt", "r+");

MG-RAY
18.4.2006, 17:29
Covek je zaboravio ; u prethodnoj liniji koda. :kreza:
Znaci, umesto:
f = fopen("test.txt", "r+")
ide:
f = fopen("test.txt", "r+");
...Thanks...:) :) :) :) :) :) :) :) :)

priest (of_the_moon)
18.4.2006, 18:45
Evo i c++ koda za kopiranje "na tacni":


#include <iostream>
#include <fstream>
using namespace std;

int KopirajFajl(char* strIzvor, char* strDest)
{
int iVelicina;
char* buffer;

// otvaranje strimova (fajlova)
ifstream infile (strIzvor, ifstream::binary | ifstream::in);
if(infile.fail()) // izvor ne postoji ?
return 0;
ofstream outfile(strDest, ofstream::binary | ofstream::out);

// pronalazenje velicine fajla
infile.seekg(0, ifstream::end);
iVelicina = infile.tellg();
infile.seekg(0, ifstream::beg);

buffer = new char [iVelicina]; // rezervisanje memorije za buffer
infile.read(buffer, iVelicina); // kopiranje fajla u buffer
outfile.write(buffer, iVelicina); // kopiranje buffera u novi fajl

// zatvaranje strimova i oslobadjanje memorije
outfile.close();
infile.close();
delete [] buffer;

return 1;
}

int main()
{
if(KopirajFajl("test.txt", "novi.txt"))
cout << "Kopiranje uspesno.";
else
cout << "Greska: ne postoji izvor.";

cout << endl;
return 0;
}


Ako planiraš da kopiraš veće fajlove (recimo fajlove od po 100MB i više, mada veličina zavisi od količine slobodnog RAM-a), onda bi bilo dobro da čitanje i pisanje obaviš u serijama tj. da podeliš fajl na segmente, da bi se izbeglo swapovanje po hardu ako komp nema dovoljno memorije.

voodoo_
19.4.2006, 0:00
Kopiranje bi trebalo vršiti u chunkovima, recimo po 32 ili 64k ko što radi Total Commander... nešto recimo kao

FILE *fSource=fopen("Ime1", "rb");
FILE *fDest=fopen("Ime2", "wb");

unsigned int bytesRead;
unsigned char *buffer[32*1024];

bytesRead = fread(buffer, 1, sizeof(buffer), fSource);
while (!bytesRead) {
fwrite(buffer, 1, bytesRead, fDest);
bytesRead = fread(buffer, 1, sizeof(buffer), fSource);
}

fclose(fSource);
fclose(fDest);

barjaktar
19.4.2006, 12:28
Covek je zaboravio ; u prethodnoj liniji koda. :kreza:
Znaci, umesto:
f = fopen("test.txt", "r+")
ide:
f = fopen("test.txt", "r+");

Ispade da sam stvarno glup:boodala: ... u sta sam ja gledao... matero jedita!

priest (of_the_moon)
19.4.2006, 14:15
Kopiranje bi trebalo vršiti u chunkovima, recimo po 32 ili 64k ko što radi Total Commander
Nije mi jasno zašto chunk ne bi bio 32MB ako komp ima 512MB RAM-a (da predpostavimo da je polovina slobodna)? Petlja bi bila 1000 puta manja, i što je još važnije, ako fajl nije fragmentiran, glava za čitanje sa harda će mnogo manje skakati tamo-vamo (čitaj iz stare lokacije, piši na novu lokaciju).

Mislim da si napravio grešku u kodu. Nije while(!bytesRead) nego while(bytesRead). Jer !(različito od nule) je false, što prekida petlju.

voodoo_
20.4.2006, 13:02
Za ovo zadnje si u pravu, ali što se tiče bafera, što je manji bafer manje se opterećuje komp ako još nešto radiš. Da li si nekad probao da režeš nešto u Neru sa nameštenim baferom od 64 MB, a pritom da radiš još neke zahtevnije stvari? Kod mene u takvoj situaciji hard tandrlja nenormalno a posle gašenja Nera sledi "čišćenje" swapa od desetak sekundi. Muka jedna. A u slučaju sa manjim chunkovima glava neće puno skakati jer će da radi keš na hard disku. Barem je kod mene tako.

priest (of_the_moon)
20.4.2006, 22:43
Keš čini čuda u svim situacijama. Ko se kod nas u to nije uverio? :D
Ako je komp pod opterećenjem tj. zauzet mu je RAM, naravno da će swapovati prilikom upotrebe velikog buffera. Nego, zaboravih na keš od harda, ako je 2 ili 8 MB razlike u brzini gotovo i da nema. Isto važi za rezače i nero. Znači stvarno je bolje koristiti manje chunk-ove.

da007
14.5.2006, 23:08
A sto se kopiranje ne bi radilo ovako:

#include <stdlib.h>

int main(int argc, char* argv[])
{
system("copy fajl1.txt fajl2.txt");
system("delete fajl1.txt");
return 0;
}

DOS je iz raja izasao ;) .

priest (of_the_moon)
6.6.2006, 21:23
DOS je iz raja izasao ;) .
Nije iz raja, već iz khhhm... majkrosofta.