Ĺadny brzuch
Mam taki kod:
#include <iostream> #include <string> #include <unistd.h> #include <cstdlib> using namespace std; void _zip(const string& filetype); void _rar(const string& filetype); void _targz(const string& filetype); void _tarbz(const string& filetype); enum rozsz {zip=0, rar, targz, tarbz}; int main(int argc, char *argv[]){ if(argc < 2){ cout << "Usage: " << argv[0] << " archive.(rar, zip, tar.gz, tar.bz)" << endl; exit(1); } string path; path = argv[1]; string::size_type x = path.find('.'); if(x == string::npos) exit(1); string filetype; filetype = path.substr(x+1); rozsz y; //if (){ ///int ppp; switch(y){ case zip: _zip(filetype); break; case rar: _rar(filetype); break; case targz: _targz(filetype); break; case tarbz: _tarbz(filetype); break; default: cout << "Nieznany format pliku" << endl; exit(1); break; } } void _zip(const string& filetype){ cout << "zip" << endl; } void _rar(const string& filetype){ cout << "rar" << endl; } void _targz(const string& filetype){ cout << "tar.gz" << endl; } void _tarbz(const string& filetype){ cout << "tar.bz" << endl; }
Kłopot mam z tym enum i switch. Switch wymaga inta, ale nie wiem, jak by to zrobić.
Moge oczywiście porównywać stringi, co nawet chciałem zrobić, ale chciałbym to zobaczyć na enum, z wykorzystaniem którego mam dość spore kłopoty. Jakby "połączyć" y z filetype? Jakby to wyglądało poprawnie?
Użytkownik lszk edytował ten post 31 lipiec 2006, 21:57
probowales rzutowac
switch ( (int) y ) .....
?
Jak uruchomie ten progs
./tarzip archiwum.tar.gz
To chce, aby po rozszerzeniu (tar.gz) wykonywała się odpowiednia część switch, czyli w tym wypadku case targz:
I właśnie jest problem, bo nie wiem, jak "połączyć" rozszerzenie pliku z obiektem enum (w tym przypadku z y) tak, aby orientował się po tym, co jest w filetype. Jakoś inaczej teog nie umie wytłumaczyć...
switch ( (int) y )
W jaki sposób dzięki czemuś takiemu miałoby działać to, o co mi chodzi, skoro rozszerzenie pliku jest nieznane dla programu?
///int ppp; switch(y){
To wpisałem tylko od tak, aby switch nie pozostał pusty ;)
Użytkownik lszk edytował ten post 31 lipiec 2006, 21:57
Pytasz się: Jak przerobić stringa by pasował do switch, bym mógł sobie wygodnie case'ować wynik.
Odp: Trzeba użyć if...else, czyli użycie switcha mija się z celem. Nistety, nie ma innego sposobu...
...chyba że zrobisz taką sztuczke:
char roz[] = "zip"; // łącznie z zerem wychodzą 4 char, czyli 4 bajty int roz2 = 0; // ma 4 bajty roz2 = *((int*)roz);
i można bez skrupułów stosować switcha :)
nie zrozumialem pytania, :P myslalem ze blad Ci w switchu wyskoczyl (chociaz nie powinien z enum'em). Bez if'ów nie dasz sobie rady, chyba, ze zastosujesz ten trick co Real_Noname pokazal... tylko kto powiedzial ze rozszerzenie musi miec 3 znaki - moze miec wiecej (no chociazby calego .tar.gz tym nie wylapiesz)
Hmm czyli rozumiem, że switcha mógłbym co najwyżej użyć do wyboru z jakiegoś menu:
1. zip
2. rar
itp.
OK. To jednak zostanie porównywanie stringów. A już myslałem, że wymyśliłem fajny sposób na przećwiczenie enum xD
Thx all.
nie zrozumialem pytania, :P myslalem ze blad Ci w switchu wyskoczyl (chociaz nie powinien z enum'em). Bez if'ów nie dasz sobie rady, chyba, ze zastosujesz ten trick co Real_Noname pokazal... tylko kto powiedzial ze rozszerzenie musi miec 3 znaki - moze miec wiecej (no chociazby calego .tar.gz tym nie wylapiesz)
A od czego jest __int64 ? Na wszystko są rozwiązania ;)
lszk - do tego triku enum tez da się użyć - przeliczas sobie wcześniej wartości i wstawiasz pod enum :)
Ten zapis __int64 mi się w moim gcc nie kompiluje. W Megatutorialu znalazłem zapis
Visual C++ udostępnia też nieco lepszy sposób na określenie wielkości typu liczbowego.
Jest nim użycie frazy __intn, gdzie n oznacza rozmiar zmiennej w bitach.
Także rzeczywiście tylko on to udostepnia? Czy bym musiał coś dopisać.
Co do tego switch to się zgubiłem. Już za późno chyba.
//char rotfl[] = filetype; int rotfl_int = 0; rotfl_int = *((int*)filetype.c_str()); switch(rotfl_int){ case 7367034: //zip _zip(filetype); break; case 7496050: //rar _rar(filetype); break;
Coś w tym stylu miałoby to być? Te liczby to wyniki dla cout << rotfl_int;
Tak niby działa :| Raz się zip, raz rar wyświetli w zależności do wrzuce do argv[1]. Tylko po co wtedy ten enum? Zresztą jakbym to wrzucił na innego kompa, to jest chyba pewne, że te wyniki by się nie zgadzały (?) Poprosiłbym o jakiś przykładowy kod dla lepszego wyobrażenia tego.
I jeszcze ten __int64 zaczął mnie interesować.
Użytkownik lszk edytował ten post 31 lipiec 2006, 23:44
Aha, ty kompilujesz na GCC - tam jest zapis tego typu jakolong long int
A wypadało by to co zapisałeś w ładne enum opakować:enum { zip = 7367034, rar = 7496050, ... };
Bo jak któregos pięknego dnia zechce ci się znowu zajrzeć do projektu to tylko wywalisz gały i "skąd mi się te liczby wzieły??".
Dzięki, już rozumiem. Napisałem to już do końca, może się komuś przyda :)
#include <iostream> #include <string> #include <unistd.h> #include <sys/types.h> #include <cstdlib> using namespace std; void _zip(char** arg_list){ pid_t child = fork(); if(child == 0) execvp("unzip", arg_list); else abort(); } void _rar(char **arg_list){ pid_t child = fork(); if(child == 0) execvp("unrar", arg_list); else abort(); } void _targz(char **arg_list){ pid_t child = fork(); if(child == 0) execvp("tar", arg_list); else abort(); } void _tarbz2(char **arg_list){ pid_t child == fork(); if(child == 0) execvp("tar", arg_list); else abort(); } enum rozsz {zip=7367034, rar=7496050, targz=31335, tarbz2=3308130}; int main(int argc, char *argv[]){ if(argc < 2){ cout << "Usage: " << argv[0] << " archive.(rar, zip, tar.gz, tar.bz2)" << endl; exit(1); } char* arg_list_zip[] = { "unzip", "-x", argv[1], NULL }; char* arg_list_rar[] = { "unrar", "e", argv[1], NULL }; char* arg_list_tarbz2[] = { "tar", "-jxvf", argv[1], NULL }; char* arg_list_targz[] = { "tar", "-zxvf", argv[1], NULL }; string path; path = argv[1]; string::size_type x = path.find_last_of('.'); if(x == string::npos){ cout << "Nierozpoznany format pliku" << endl; exit(1); } string filetype; filetype = path.substr(x+1); int rotfl_int = 0; rotfl_int = *((int*)filetype.c_str()); switch(rotfl_int){ case zip: _zip(arg_list_zip); break; case rar: _rar(arg_list_rar); break; case targz: _targz(arg_list_targz); break; case tarbz2: _tarbz2(arg_list_tarbz2); break; default: cout << "Nieznany format pliku" << endl; exit(1); break; } }
Nie jestem tylko pewien zastowania w tym przypadku funkcji fork(). Musze jszcze doczytać :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <iostream> #include <string> #include <unistd.h> #include <cstdlib> using namespace std; void _zip(const string& filetype); void _rar(const string& filetype); void _targz(const string& filetype); void _tarbz(const string& filetype); enum rozsz {zip=0, rar, targz, tarbz}; int main(int argc, char *argv[]){ if(argc < 2){ cout << "Usage: " << argv[0] << " archive.(rar, zip, tar.gz, tar.bz)" << endl; exit(1); } string path; path = argv[1]; string::size_type x = path.find('.'); if(x == string::npos) exit(1); string filetype; filetype = path.substr(x+1); rozsz y; //if (){ ///int ppp; switch(y){ case zip: _zip(filetype); break; case rar: _rar(filetype); break; case targz: _targz(filetype); break; case tarbz: _tarbz(filetype); break; default: cout << "Nieznany format pliku" << endl; exit(1); break; } } void _zip(const string& filetype){ cout << "zip" << endl; } void _rar(const string& filetype){ cout << "rar" << endl; } void _targz(const string& filetype){ cout << "tar.gz" << endl; } void _tarbz(const string& filetype){ cout << "tar.bz" << endl; }
Kłopot mam z tym enum i switch. Switch wymaga inta, ale nie wiem, jak by to zrobić.
Moge oczywiście porównywać stringi, co nawet chciałem zrobić, ale chciałbym to zobaczyć na enum, z wykorzystaniem którego mam dość spore kłopoty. Jakby "połączyć" y z filetype? Jakby to wyglądało poprawnie?
Użytkownik lszk edytował ten post 31 lipiec 2006, 21:57
probowales rzutowac
switch ( (int) y ) .....
?
Jak uruchomie ten progs
./tarzip archiwum.tar.gz
To chce, aby po rozszerzeniu (tar.gz) wykonywała się odpowiednia część switch, czyli w tym wypadku case targz:
I właśnie jest problem, bo nie wiem, jak "połączyć" rozszerzenie pliku z obiektem enum (w tym przypadku z y) tak, aby orientował się po tym, co jest w filetype. Jakoś inaczej teog nie umie wytłumaczyć...
switch ( (int) y )
W jaki sposób dzięki czemuś takiemu miałoby działać to, o co mi chodzi, skoro rozszerzenie pliku jest nieznane dla programu?
///int ppp; switch(y){
To wpisałem tylko od tak, aby switch nie pozostał pusty ;)
Użytkownik lszk edytował ten post 31 lipiec 2006, 21:57
Pytasz się: Jak przerobić stringa by pasował do switch, bym mógł sobie wygodnie case'ować wynik.
Odp: Trzeba użyć if...else, czyli użycie switcha mija się z celem. Nistety, nie ma innego sposobu...
...chyba że zrobisz taką sztuczke:
char roz[] = "zip"; // łącznie z zerem wychodzą 4 char, czyli 4 bajty int roz2 = 0; // ma 4 bajty roz2 = *((int*)roz);
i można bez skrupułów stosować switcha :)
nie zrozumialem pytania, :P myslalem ze blad Ci w switchu wyskoczyl (chociaz nie powinien z enum'em). Bez if'ów nie dasz sobie rady, chyba, ze zastosujesz ten trick co Real_Noname pokazal... tylko kto powiedzial ze rozszerzenie musi miec 3 znaki - moze miec wiecej (no chociazby calego .tar.gz tym nie wylapiesz)
Hmm czyli rozumiem, że switcha mógłbym co najwyżej użyć do wyboru z jakiegoś menu:
1. zip
2. rar
itp.
OK. To jednak zostanie porównywanie stringów. A już myslałem, że wymyśliłem fajny sposób na przećwiczenie enum xD
Thx all.
nie zrozumialem pytania, :P myslalem ze blad Ci w switchu wyskoczyl (chociaz nie powinien z enum'em). Bez if'ów nie dasz sobie rady, chyba, ze zastosujesz ten trick co Real_Noname pokazal... tylko kto powiedzial ze rozszerzenie musi miec 3 znaki - moze miec wiecej (no chociazby calego .tar.gz tym nie wylapiesz)
A od czego jest __int64 ? Na wszystko są rozwiązania ;)
lszk - do tego triku enum tez da się użyć - przeliczas sobie wcześniej wartości i wstawiasz pod enum :)
Ten zapis __int64 mi się w moim gcc nie kompiluje. W Megatutorialu znalazłem zapis
Visual C++ udostępnia też nieco lepszy sposób na określenie wielkości typu liczbowego.
Jest nim użycie frazy __intn, gdzie n oznacza rozmiar zmiennej w bitach.
Także rzeczywiście tylko on to udostepnia? Czy bym musiał coś dopisać.
Co do tego switch to się zgubiłem. Już za późno chyba.
//char rotfl[] = filetype; int rotfl_int = 0; rotfl_int = *((int*)filetype.c_str()); switch(rotfl_int){ case 7367034: //zip _zip(filetype); break; case 7496050: //rar _rar(filetype); break;
Coś w tym stylu miałoby to być? Te liczby to wyniki dla cout << rotfl_int;
Tak niby działa :| Raz się zip, raz rar wyświetli w zależności do wrzuce do argv[1]. Tylko po co wtedy ten enum? Zresztą jakbym to wrzucił na innego kompa, to jest chyba pewne, że te wyniki by się nie zgadzały (?) Poprosiłbym o jakiś przykładowy kod dla lepszego wyobrażenia tego.
I jeszcze ten __int64 zaczął mnie interesować.
Użytkownik lszk edytował ten post 31 lipiec 2006, 23:44
Aha, ty kompilujesz na GCC - tam jest zapis tego typu jakolong long int
A wypadało by to co zapisałeś w ładne enum opakować:enum { zip = 7367034, rar = 7496050, ... };
Bo jak któregos pięknego dnia zechce ci się znowu zajrzeć do projektu to tylko wywalisz gały i "skąd mi się te liczby wzieły??".
Dzięki, już rozumiem. Napisałem to już do końca, może się komuś przyda :)
#include <iostream> #include <string> #include <unistd.h> #include <sys/types.h> #include <cstdlib> using namespace std; void _zip(char** arg_list){ pid_t child = fork(); if(child == 0) execvp("unzip", arg_list); else abort(); } void _rar(char **arg_list){ pid_t child = fork(); if(child == 0) execvp("unrar", arg_list); else abort(); } void _targz(char **arg_list){ pid_t child = fork(); if(child == 0) execvp("tar", arg_list); else abort(); } void _tarbz2(char **arg_list){ pid_t child == fork(); if(child == 0) execvp("tar", arg_list); else abort(); } enum rozsz {zip=7367034, rar=7496050, targz=31335, tarbz2=3308130}; int main(int argc, char *argv[]){ if(argc < 2){ cout << "Usage: " << argv[0] << " archive.(rar, zip, tar.gz, tar.bz2)" << endl; exit(1); } char* arg_list_zip[] = { "unzip", "-x", argv[1], NULL }; char* arg_list_rar[] = { "unrar", "e", argv[1], NULL }; char* arg_list_tarbz2[] = { "tar", "-jxvf", argv[1], NULL }; char* arg_list_targz[] = { "tar", "-zxvf", argv[1], NULL }; string path; path = argv[1]; string::size_type x = path.find_last_of('.'); if(x == string::npos){ cout << "Nierozpoznany format pliku" << endl; exit(1); } string filetype; filetype = path.substr(x+1); int rotfl_int = 0; rotfl_int = *((int*)filetype.c_str()); switch(rotfl_int){ case zip: _zip(arg_list_zip); break; case rar: _rar(arg_list_rar); break; case targz: _targz(arg_list_targz); break; case tarbz2: _tarbz2(arg_list_tarbz2); break; default: cout << "Nieznany format pliku" << endl; exit(1); break; } }
Nie jestem tylko pewien zastowania w tym przypadku funkcji fork(). Musze jszcze doczytać :)