Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Permission Denied tylko dla jednego pliku

nero_pat 08 Wrz 2010 21:09 1133 3
  • #1 08 Wrz 2010 21:09
    nero_pat
    Poziom 9  

    Witam, mam pewien problem, nie mogę znaleźć błędu w swojej funkcji :(( Proszę, pomóżcie mi! :(

    Funkcja zewnętrzna ma wczytywać listę uczestników, sprawdzać, czy dany uczestnik jest w bazie danych, w pliku "data/baza_ucz.txt", jeśli go nie ma, to ma "stworzyć uczestnika", co oznacza po prostu dopisanie odpowiedniej linijki do pliku z listą uczestników. Znalazłem już miejsce, w którym program się zawiesza, jednak nie wiem dlaczego. Sądziłem, że po prostu gdzieś nie zamknąłem tego pliku, jednak nigdzie takiej sytuacji nie widzę. Pomyślałem, że może jeszcze jest coś, czego ja nie wiem i dlatego mi błąd wyskakuje...

    Oto kod:

    Funkcja zewnętrzna:
    (Ona jest jeszcze niedokończona, ale akurat to nie ma znaczenia, bo i tak nie wraca jeszcze z wywołania funkcji "stworz_uczestnika(pam , 0);"

    Code:

    void wczytaj_uczestnikow(int liczba_uczestnikow)
    {
       
       int lup = policz_dlugosc_pliku("wejscie/lista.txt") + 1 , czy_znalazlo = 0;

    char pam[255];

       for(int i=1; i<=lup;i++)
          {
             
             wczytaj_z_pliku("wejscie/lista.txt" , i);
             //printf("global_pamiec = %s , strlen = %d\n" , global_pamiec , strlen(global_pamiec)-1);
             strncpy(pam,global_pamiec,strlen(global_pamiec));
             //printf("pam[%d] = %s\n" , i , pam);
             wczytaj_nick(pam);
             for(int j=0;j<255;j++)
             pam[j]='\0';
             strncpy(pam,global_pamiec,strlen(global_pamiec));
             //printf("pam[%d] = %s\n" , i , pam);
             czy_znalazlo = szukaj_w_pliku_n("data/baza_ucz.txt" , pam , strlen(pam)-1);
             if(czy_znalazlo==0)
                {

                stworz_uczestnika(pam , 0);
                
                }
             for(int j=0;j<255;j++)
             pam[j]='\0';






          }

    return ;

    }


    Następnie funkcja stworz_uczestnika :

    Code:

    void stworz_uczestnika(char *nick , int respekt)
    {

       char dane[500] , resp[10];

       for(int j=0;j<strlen(nick);j++)
             if(nick[j] == 10)
             nick[j] = '\0';
             
       strcpy(dane, nick);
       strcat(dane , " @^");
       sprintf(resp , "%d" , respekt);
       strcat(dane , resp);
       strcat(dane , "\n");
       printf("dane: %s\n" , dane);
       dopisz_do_pliku("data/baza_ucz.txt" , dane);
       
       

       return;
    }


    Oraz funkcja dopisz_do_pliku, na której się zatrzymuje i pokazuje błąd:
    "Nie mozna otworzyc pliku! - 3: Permission Denied"

    Dodam tylko, że z tej funkcji korzystam już od bardzo dawna w innych swoich programach, napisałem ją dawno temu (dlatego też jest w niej jeszcze większy bałagan niż w reszcie xD), i ona nigdy mi problemów nie sprawiała. Sprawdziłem ją na dopisywanie linijki do tego samego pliku (data/baza_ucz.txt), lecz po zmianie nazwy (zmieniłem nazwę tego pliku i w tej funkcji, ale w reszcie pozostawiłem starą nazwę) i wtedy dopisywało do niego bez problemów... Czyli, że tak powiem te wskazane funkcje w jakiś sposób się "gryzą", tylko nie wiem jak :(

    Code:

    void dopisz_do_pliku(char *nazwapliku, char *linijka)
    {

       char c[201];
       int ilslin = 0 , i , t;
       i = strlen(linijka);
       t = i+1;
       char linijka2[t];
       for(i=0;i<t;i++)
          linijka2[i] = '\0';
       strcpy(linijka2 , linijka);
       strcat(linijka2 , "\n");
       FILE *plik;
       plik = fopen(nazwapliku , "r");

                if(plik == NULL)
                {
                   printf("plik = %s\n" , nazwapliku);
                   perror("Nie mozna otworzyc pliku! - 1 ");
                   return ;
                }

       while(feof(plik)==0)
       {

          fgets(c , 200 , plik);

          ilslin += 1 ;

       }

       fclose(plik);
          ilslin += 1;

       char **linijki = (char**) malloc(ilslin*sizeof(char*));

       for(i = 0; i < ilslin; i++)
       {
           linijki[i] = (char*) malloc(200*sizeof(char));     
           linijki[i][0] = 0;     
                         
       }

       strcpy(linijki[ilslin-1] , linijka2);

       plik = fopen(nazwapliku , "r");
                if(plik == NULL)
                {
                   printf("plik = %s\n" , nazwapliku);
                   perror("Nie mozna otworzyc pliku! - 2");
                   return ;
                }
       i = 0;
       while(feof(plik) ==0)
       {
             fgets(linijki[i] , 199 , plik);
             i+=1;
       }

          fclose(plik);
          FILE *plik2;
          plik2 = fopen(nazwapliku , "w");
                if(plik2 == NULL)
                {
                   printf("plik = %s\n" , nazwapliku);
                   perror("Nie mozna otworzyc pliku! - 3");
                   return ;
                }
    printf("Tutaj!\n");
          for(i=0;i<ilslin;i++)
       {

             fputs(linijki[i] , plik2);
          
          
       }
       printf("Tutaj!");
          fclose(plik2);
    return;
    }


    A tutaj jeszcze funkcja szukaj_w_pliku_n, ktora również korzysta z tego pliku, którego nie może otworzyć, więc ją podam:
    Code:
    int szukaj_w_pliku_n(char *nazwapliku , char *slow , int n)
    
    {

    FILE *plik;
        int nr = 0 , k = 1;

        plik = fopen(nazwapliku , "r");

        char pamiec[200] ;

        while(feof(plik)==0 && k!=0)
        {

            nr +=1 ;
            fgets(pamiec , 200 , plik);
            k = strncmp(pamiec, slow , n);
            //printf("Pamiec: %s\n" , pamiec);

        }

        if(k!=0)
            nr = 0;
        fclose(plik);
        return nr;

    }

    void stworz_uczestnika(char *nick , int respekt)
    {

        char dane[500] , resp[10];

        for(int j=0;j<strlen(nick);j++)
                if(nick[j] == 10)
                nick[j] = '\0';
               
        strcpy(dane, nick);
        strcat(dane , " @^");
        sprintf(resp , "%d" , respekt);
        strcat(dane , resp);
        strcat(dane , "\n");
        printf("dane: %s\n" , dane);
        dopisz_do_pliku("data/baza_ucz.txt" , dane);
       
       

        return;
    }

    0 3
  • Pomocny post
    #2 08 Wrz 2010 22:28
    Dr.Vee
    VIP Zasłużony dla elektroda

    Jest trochę błędów...
    Ale jeśli chodzi o "permission denied" to możesz mieć np. ten sam plik otwarty w edytorze, albo ustawiony atrybut read only.

    Samo dopisanie linijki do pliku jest dużo prostsze:

    Code:
    void dopiszLinijke(const char* nazwa, const char* linia)
    
    {
        FILE* plik = fopen(nazwa, "at"); /* otwórz w trybie dopisywania na końcu */
        if (!plik)
        {
            perror("fopen");
            return;
        }
        fprintf(plik, "%s\n", linia);   /* załóż, że na końcu linii nie ma znaku '\n' */
        fclose(plik);
    }


    Pozdrawiam,
    Dr.Vee

    0
  • #3 09 Wrz 2010 12:58
    nero_pat
    Poziom 9  

    wow :O Dzięki, nie wiedziałem że jest taka opcja :D

    0
  • #4 09 Wrz 2010 13:09
    gaskoin
    Poziom 38  

    było zerknąć do manuala libc :P

    0