Funkcje systemowe.

0

Witam, mam do napisania program w C pod Linuxem przy użyciu funkcji systemowych: open(), write(), readdir() I read(). Program ma stworzyć plik o nazwie podanej jako argument główny(jeśli istnieje już taki plik-koniec programu) następnie do stworzonego pliku wpisać zawartość folderu posortowaną przez funkcję readdir. Podczas kompilacji poniższego programu nie ma żadnych błędów, lecz do powstałego pliku nie zostaje nic zapisane, a fagment programu odpowiedzialny za odczytanie tego pliku generuje błąd Segmentation fault. Czy ktoś może powiedzieć co jest nie tak?

Kod:


#include <dirent.h>
#include <stdio.h>
#include <sys/file.h>
#include <fcntl.h>


# define BUFSIZE 200


int main(int argc, char *argv[])
{
        int plik;
        const char * nazwa = argv[1];
        const int F_OK = 0;
        struct dirent * data;
        DIR * sciezka;
        char *buf;
        int i=0;

        if( argc == 1)
        {
            printf("Nie mozna pobrac nazwy pliku, brak argumentu\n");
            return 0;
        }




        if (!access (nazwa, F_OK)) {
            printf ("Plik o nazwie %s juz istnieje!\n", argv[1]);
        return 0;
                }



         plik = open(nazwa, O_RDWR | O_TRUNC | O_CREAT, 0644);
         if( plik != -1)
         printf("Tworze plik o nazwie %s\n", nazwa);
         else
         {
         printf("Wystapil blad\n");
        return 0;
         }
         close(plik);



    plik = open(nazwa, O_WRONLY | O_APPEND);
    if(plik == -1){printf("ERROR - Nie mozna otworzyc pliku!");}

     if(( sciezka = opendir( nazwa ) ) ) {
        while(( data = readdir( sciezka ) ) )
        {
            buf=(data[i].d_name);
            write(plik,buf,strlen(buf));
            write(plik,"\n",1);
            i++;
        }

        closedir( sciezka );
    }


         printf("Zamykam plik!\n");
         close(plik);



         plik=open(nazwa, O_RDONLY);
			if(plik==-1)
			{
			printf("Nie udalo sie otworzyc pliku\n");
			}                                                               /// SEGMENTATION FAULT(CORE DUMPED)
			else
			{
			read(plik,buf,BUFSIZE);
			printf("%s",buf);
			}







        printf("Zamykam plik!\n");
        close(plik);

        return 0;
}

```C
1

Nie do końca rozumiem co chcesz osiągnąć. Pierwszy parametr programu traktujesz jednocześnie jako nazwę pliku i ścieżkę folderu?

Poza tym:

  1. Patalne formatowanie. Jak nie umiesz sam to http://format.krzaq.cc
  2. Pierw dokonujesz dereferencji argv a dopiero potem sprawdzasz argc. To jest UB.
1

To może jeszcze na koniec jak już uda się poprawić aby to miało sens bo ja nawet nie czytałem skoto błędy zostały wyłapane. Natomiast widać że nie ustawiasz w open tworząc plik FLAG permission czyli kto może plik czytać masz do wyboru właściciela grupe i other. powodzenia

man open otworzy ci oczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1