[c++]Skrypt wyszukujący pliki, 2 problemy


(Withorlo2) #1

Witam, mam do Was dwie prośby/pytania. Mianowicie:

Poniżej jest kod programu służącego do wyszukiwania plików na dysku.

#include 

#include 

#include 

#include 


using namespace std;


void WyszukajIWypisz(const string& szukaj, string scierzka, ostream & wyjscie);


int main(int argc, char *argv[])

{

    char start[4] = "@:\\";

    string wyszukanie;


    while (true)

    {

        clog<<"Wpisz nazwe obiektu, ktory ma zostac wyszukany na calym dysku\n"

              "twardym, lub wcisnij Ctrl + Z aby wprowadzic EOF\n->";

        getline(cin, wyszukanie);

        if (!cin) break;

        for (*start = 'A'; *start <= 'Z'; ++*start)

        {

            WyszukajIWypisz(wyszukanie, start, cout);


        }

        clog<<"Wyszukanie zakonczone\n"<
    }


    return 0;

}


void WyszukajIWypisz(string const & szukaj, string scierzka, ostream & wyjscie)

{

    DIR * fol;

    dirent * dir;


    if ((fol = opendir(scierzka.c_str())) == NULL) return;


    string temp;

    struct stat info;


    while((dir = readdir(fol)) != NULL)

    {

        temp = dir->d_name;

        if (temp == "." || temp == "..") continue;

        if (stat((scierzka + temp).c_str(), &info) != 0) continue;

        if (S_ISDIR(info.st_mode)) WyszukajIWypisz(szukaj, scierzka + temp + '\\', wyjscie);

        if (temp.find(szukaj) != string::npos) wyjscie<d_name<<'\n';

    }

    closedir(fol);

}

Po wpisaniu np. plik.txt program wyszukuje wszystkie pliki o tej nazwie i wyświetla ich ścieżki.

PROBLEM #1:

Co zrobić aby wyświetlone ścieżki zostały zapisywane do osobnych zmiennych tudzież do tablicy tak abym mógł je później wykorzystać.

PROBLEM #2:

Powiedzmy że ścieżka do plik.txt wygląda następująco: C:\plik.txt, co zrobić żeby wszystkie backslash'e "\" w ścieżce zamieniły się na slash'e "/". (w sensie gdy już będę miał wyizolowane ścieżki z #1)

Jeśli ktoś ma chociaż pomysł na to jak można te zagadnienia rozwiązać to proszę napisać.


(kostek135) #2

AD1

Możesz użyć np. vector (ewentualnie statyczną tablice jeśli wiesz, że plików nie będzie więcej niż), w którym są stringi. Ze znalezieniem każdego kolejnego pasującego napisu wstawiasz go do vectora.

AD2

Najprościej iterujesz znak po znaku i jesli znak == '\' wstaw w to miejsce '/'.


(Witos) #3

Co do #2:

#include 

std::replace(str.begin(), str.end(), '\\', '/');

(Withorlo2) #4

Dzięki za odpowiedź, ale chyba będziecie musieli mi jeszcze raz pomóc.

Zrobiłem vector za radą kostka i wykorzystałem push_back() do dodania ścieżki do tablicy ale wywala mi następujący błąd:

error: invalid use of void expression

Jedyne co zmieniłem w programie od ostatniego posta to:

#include 

[...]

std::vector tablica;

[...]

for (*start = 'A'; *start <= 'Z'; ++*start)

        {

            tablica.push_back(WyszukajIWypisz(wyszukanie, start, cout));

        }

(kostek135) #5

WyszukajIWpisz "zwraca" typ void, wstawiasz to (a właściwie nic) do vectora, któremu zadeklarowałeś, że będziesz wstawiał string. W sumie chyba nie przejdzie. Co to za zmienna start, bo nie ogarniam, gdzie ona jest zadeklarowana.

EDIT. Dyski, dobra już ogarnąłem. Lekki zwis świadomości.