ďťż

Ładny brzuch

Czy jest jakaś funkcja któwra by zwracała liczbę katalogów? I czy jest funkcja która by zwracała nazwy tych katalogów? Chodzi np. o to żeby powiedzieć ile jest katalogów w "C:\" i jak się nazywają. Prosi bym bez WinApi bo to pod linuxa programik jest. Je



Przeczytaj to.
Użytkownik Chmurek edytował ten post 17 marzec 2006, 12:07

Przeczytaj to.

Jeśli nie potrafisz czytać manuali po angielsku to właściwie możesz sobie dać spokój z programowaniem dopóki nie będziesz potrafił.
Ale używa się tego w ten sposób:
DIR *katalog; katalog = opendir("/home"); struct dirent *plik = readdir(katalog);
I teraz w plik masz dane pierwszego pliku w katalogu. Kolejne wywołania readdir będą podawać dane kolejnych plików. Napisałbym więcej, ale trochę się spieszę.



ok poradizłem sobie z tą funkcją. Niewiem czy twożyć nowy temat, ale napisze w tym. Mianowicie pisze program z użyciem tej funkcji. Ma on zapisać nazwy katalogów z danej lokalizacji do tabeli a później wyświetlić je na ekranie. Kompiluje się bez błędów ale kiedy chjcę go otwożyć pojawia się taki komunikat:(w konsoli w linuxie żeby niebyło że winda takie inteligentne komunikaty pokazuje:D):

Naruszenie ochrony pamięci
I co ja mam z tym fantem zrobić?? Tu jest kod programu:
#include <iostream> #include <dirent.h> using namespace std; struct dirent *strukP; struct dirent *strukG; int lk = 0; int main(){ DIR *scG = opendir("/"); string tab[0][lk]; while (strukG = readdir(scG)){ if(strukG->d_ino != 0) { lk++; tab[0][lk] = strukG->d_name; } } while(lk<=0){ cout<<tab[0][lk]<<endl; lk--; } closedir(scG); return 0; }

Tworzysz tablicę o wymiarach [0][0], a później próbujesz coś do niej przypisać. Dlatego się wywala.
A tak ogólnie do wykrywania tego typu błędów służy gdb. Naprawdę polecam zapoznać się z jego obsługą.
Poza tym wczytuj nazwy plików do listy raczej niż do tablicy, bo nie wiesz na początku ile ich będzie.

Ale jesli naprawdę chcesz wczytywać je do tablicy to możesz to robić na przykład tak:
#include <iostream> #include <dirent.h> using namespace std; int main() {  DIR *katalog = opendir("/");  string tablica[500] = {};  int i = 0;  struct dirent *plik = NULL;  do  {    plik = readdir(katalog);    if (!plik)      break;    tablica[i] = plik->d_name;    cout << tablica[i] << endl;    i++;  } while (plik);  int liczba_katalogow = i;  for (i=0;i<liczba_katalogow;i++)    cout << tablica[i] << endl;  closedir(katalog);  return 0; }
Z tym że jak widać rozmiar tablicy jest tu podany na sztywno, więc lista będzie zdecydowanie lepsza.
Użytkownik Chmurek edytował ten post 17 marzec 2006, 20:55
Ok wszystko spoko, "udoskonaliłem" swoje dziecko, mianowicie teraz tworzy tablice dwu wymiarowa i zapisuje do niej katalkogi i podlatalogi. Żeby latwiej bylo to wyobrazic:

Windows | program_files | jakis inny | jeszcze inny | katalog | na dyskuC
system32 | GTA3 | to_sa | Podkatalogi | w tych | katalogach
itd. | z tym ze | to sa nadal | podkatalogi | aNIEpodkatalog | w podkatalogachj.

Każda nazwya symbolizuje katalog. Program sie kompiluje ale przy uruchamianiu mówi tak:

Segmentation fault

Kod jest taki #include <iostream> #include <dirent.h> using namespace std; int lw = 0;                           //"liczba wierszy" czyli ilość podkatalogów w tabeli, 0 to są te główne int lk = 0;                            //"liczba kolumn" czyli liczba tych głównych katalogów struct dirent *strukG;          //struktura głównych katalogów struct dirent *strukP;         // struktura podkatalogów char *tab[1000][1000];        //nieszczesna tablica int main(){ DIR *scG = opendir("/"); while(strukG = readdir(scG)){ if(strukG->d_ino != 0) { lk++; tab[lw][lk] = strukG->d_name; } } rewinddir(scG); lk = 1; DIR *scP = opendir(tab[0][lk]); while(strukP = readdir(scP));{ if(strukP->d_ino != 0){ lw++; tab[lw][lk] = strukP->d_name; } else if(strukP->d_ino == 0){ lk++; rewinddir(scP); } } cout<<tab[3][3];      //dla sprawdzenia czy dzdiala, puźnie program będzie wynik zapisywał do pliku return 0;
Myśle że to wina tablicy. niemoge zastosować typu string, a chodzi mi o to by w jednym polu tablicy były całe nazwy a nie tylko poszczególne ich literki.
Użytkownik KeyM@ster edytował ten post 20 marzec 2006, 21:08
Mogłeś napisać, w którym miejscu się wywala, żeby ludzie czytający to nie musieli samemu sprawdzać.
W każdym razie to przez to:
if(strukP->d_ino != 0){
W pewnym momencie nie ma takiej struktury już, bo dalej już nic nie ma, a Ty próbujesz się dostać do jej składowe. Dlatego sprawdź czy strukP != NULL najpierw albo daj to zamiast tego warunku.
Użytkownik Chmurek edytował ten post 20 marzec 2006, 20:58
Nigdzie mnie nie wywala, kompiluje się bez zarzutu, tylko kiedy pod linuxem próbuje go uruchomić to pojawia mi się komunikat jak wyżej napisałem. Podejrzewam że to coś z tablicą.

Hehe. Przecież to właśnie oznacza, że program się wywalił. ;)
Napisałem czego to przyczyna i jak to rozwiązać.

mozna powiedzieć że jes postęp. Zmieniłem tak jak kazałeś, i teraz wogule nic się niedzieje :D Ktos kiedyś wyrzucił kompa przez okno??? nie ?? to chyba będe pierwszy Grrrr... zaraz mnie szlak trafi i %$%@ strzeli.

Byłem ciekaw jak zareagujesz na tą informację. ;)
Za chwilę spojrzę i napiszę co zmienić.

Ok... Zacznijmy od tego, że w tab[0][1] na sytemie uniksowym będziesz miał katalog ".". ;)
Po drugie źle wpisujesz dane do tablicy, bo wskaźniki, które tam wpisujesz mogą zacząć wskazywać na coś innego po kolejnym wywołaniu readdir.
Po trzecie próbujesz powinieneś podać pełną ścieżkę, a w tablicy masz tylko nazwy.

Popraw te trzy rzeczy, a powinno działać.
Użytkownik Chmurek edytował ten post 20 marzec 2006, 21:54
starałem się popoprawiać tak jak mówiłeś, coś zrobiłem i jest postęp. tzn już mnie nie wywala, włącza się i cos robi, niestety wygląda to tak jakby zawiesił się na którejś pętki bo po uruchomnienu nic sie nie dzieje i muszę zamykac kąsole. oto kod:
#include <iostream> #include <dirent.h> using namespace std; int lw = 0; int lk = 0; int katalogiG = 0; struct dirent *strukG; struct dirent *strukP; char *tab[1000][1000]; int main(){ DIR *scG = opendir("/"); while(strukG = readdir(scG)){ if(strukG->d_ino != 0) { lk++; tab[lw][lk] =strukG->d_name; } } katalogiG = lk; lk = 3; while(katalogiG >= 0);{ char *pomocniczy; pomocniczy = "/",tab[0][lk]; DIR *scP = opendir(pomocniczy); strukP = readdir(scP); katalogiG--; if(strukP->d_ino != 0){ lw++; tab[lw][lk] = strukP->d_name; closedir(scP); } else if(strukP->d_ino == 0){ cout<<"nie udalo sie posrac w gacie\n"; lk++; rewinddir(scG); rewinddir(scP); closedir(scP); } else{ if(strukP == NULL) cout<<"nieotworzylem katalogu\n";} } cout<<tab[4][3]; cout<<tab[3][7]; closedir(scG); return 0; }
I tka jaki mówiłem chyba zawiesza się na jakiejs pętli.

Za chwilę obejrzę, ale już widzę, że wciąż źle dane do tablicy wpisujesz - zamiast zaalokować dla każdej nazwy pamięć to wciąż uparcie wskaźniki na d_name tam wpisujesz.
A poza tym masz średnik po while w jednym miejscu, więc się nie dziw, że się zapętla. ;)
Po trzecie:
pomocniczy = "/",tab[0][lk];
Jakbyś sprawdził jak to działa to byś wiedział, że nie tak jak chcesz. ;)

Może napisz co ma robić program, a ja Ci go napiszę.
Użytkownik Chmurek edytował ten post 21 marzec 2006, 14:11
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •