Anunţ

Caută printre mesajele de pe forum înainte de a scrie unul nou!
Formulează corect întrebarea sau problema pe care o ai.
Respectă regulile forumului și Codul de Conduită!

#1 05 Jan 2017 19:57:34

JoeyMoey
Membru nou
Înregistrat: 05 Jan 2017
Mesaje: 1

Program in C sub Linux

Am nevoie de ajutor pentru a scrie in C un program care primeste ca argument in linia de comanda un director si calculeaza suma dimensiunilor fisierelor din arborescenta cu originea in el. SO este linux.
Daca ma poate ajuta cineva, as fi foarte recunoscator.

Offline

 

#2 05 Jan 2017 23:37:57

TARA24.
Membru
Înregistrat: 23 Dec 2010
Mesaje: 957

Re: Program in C sub Linux

JoeyMoey a scris:

Am nevoie de ajutor pentru a scrie in C un program care primeste ca argument in linia de comanda un director si calculeaza suma dimensiunilor fisierelor din arborescenta cu originea in el. SO este linux.
Daca ma poate ajuta cineva, as fi foarte recunoscator.

Eu te-as ajuta, dar cu Romana nu prea sunt la zi.
Ce anume vrei tu sa faci acolo? Sa calculezi "suma dimensiunilor fisierelor din arborescenta cu originea in el.". Nu inteleg intrebarea.

Adica ceva ve face comanda DU ?

Cod:

du -sh fisier

Orice decizie pe care esti pe cale sa o iei, gandeste-o de cel putin 3 ori.
Din momentul in care ai luat-o nu mai conteaza de cate ori ai gandit-o.
Fi destept, foloseste ce ti se potriveste nu ce ti se impune.

Offline

 

#3 06 Jan 2017 14:26:17

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 332

Re: Program in C sub Linux

Descarci de aici sursa la baobab http://packages.ubuntu.com/precise/gnome/baobab modifici pe ici pe colo si ai facut
un program in C , mai simplu de atit nu se poate.


Procesor:GenuineIntel ,Intel(R) Atom(TM) CPU  230   @ 1.60GHz, placa video intel G945,
2GB ram, 160GB hdd.

Offline

 

#4 06 Jan 2017 14:59:54

TARA24.
Membru
Înregistrat: 23 Dec 2010
Mesaje: 957

Re: Program in C sub Linux

STAT este cea ce ai tu nevoie.

Un exemplu:

Cod:

#include <stdio.h>
#include <sys/stat.h>

int main(void){

    struct stat file;
    if(stat("/home/tara24/test_file" ,&file) < 0){
        return 1;
    }

    printf("Information for %s\n","/home/tara24/test_file");
    printf("---------------------------\n");
    printf("File Size: \t\t%ld bytes\n",file.st_size);
    printf("Number of Links: \t%ld\n",file.st_nlink);
    printf("File inode: \t\t%ld\n",file.st_ino);

    printf("File Permissions: \t");
    printf( (S_ISDIR(file.st_mode)) ? "d" : "-");
    printf( (file.st_mode & S_IRUSR) ? "r" : "-");
    printf( (file.st_mode & S_IWUSR) ? "w" : "-");
    printf( (file.st_mode & S_IXUSR) ? "x" : "-");
    printf( (file.st_mode & S_IRGRP) ? "r" : "-");
    printf( (file.st_mode & S_IWGRP) ? "w" : "-");
    printf( (file.st_mode & S_IXGRP) ? "x" : "-");
    printf( (file.st_mode & S_IROTH) ? "r" : "-");
    printf( (file.st_mode & S_IWOTH) ? "w" : "-");
    printf( (file.st_mode & S_IXOTH) ? "x" : "-");
    printf("\n\n");

    printf("The file %s a symbolic link\n", (S_ISLNK(file.st_mode)) ? "is" : "is not");

    return 0;
}

Output:

Information for /home/tara24/test_file
---------------------------
File Size: 12144 bytes
Number of Links: 1
File inode: 1570525
File Permissions: -rwxr-xr-x

The file is not a symbolic link

Daca vrei si alte lucruri cum ar fi ultima modificare a fisirului:

Cod:

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>

void getFileTime(const char *path) ;

int main(void){
    getFileTime ("/home/tara24/test_file");
}

void getFileTime(const char *path) {
    struct stat attr;
    stat(path, &attr);
    printf("Last accessed time:\t\t%s", ctime(&attr.st_atime));
    printf("Last modified time:\t\t%s", ctime(&attr.st_mtime));
    printf("Last status change time:\t%s", ctime(&attr.st_ctime));
}

Output:

Last accessed time:    Fri Jan 6 14:17:53 2017
Last modified time:    Fri Jan 6 14:17:44 2017
Last status change time:    Fri Jan 6 14:17:44 2017

OFF:
Imi explica si mie cineva ce inseamna ==>> "suma dimensiunilor fisierelor din arborescenta cu originea in el."

Editat ultima oară de TARA24. (06 Jan 2017 15:22:44)


Orice decizie pe care esti pe cale sa o iei, gandeste-o de cel putin 3 ori.
Din momentul in care ai luat-o nu mai conteaza de cate ori ai gandit-o.
Fi destept, foloseste ce ti se potriveste nu ce ti se impune.

Offline

 

#5 06 Jan 2017 15:30:05

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 332

Re: Program in C sub Linux

Vrea program cu un argument spre exemplu in /home sa caute fisiere si sa faca suma acestora, sau cel putin asa am inteles eu.


Procesor:GenuineIntel ,Intel(R) Atom(TM) CPU  230   @ 1.60GHz, placa video intel G945,
2GB ram, 160GB hdd.

Offline

 

#6 06 Jan 2017 19:23:20

TARA24.
Membru
Înregistrat: 23 Dec 2010
Mesaje: 957

Re: Program in C sub Linux

bula20 a scris:

sau cel putin asa am inteles eu.

Sunt si eu curios de asta.


@JoeyMoey

Iti dai seama ca nu o sa iti facem noi tema de casa, nu?

Aici ai un program care face ce vrei tu, insa doar pe un Fisier, iti ramane tie sa gandesti cum se cisteste un Director si cum aduni acele fisier.

80% din munca ti-am facut-o eu:

Cod:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>

size_t my_strrchr(const char *ptr, const char delimiter);
char *getPath(const char *ptr);
void checkBuffer(const char *ptr);
long int getFileSize(const char *ptr);

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

    if (argc != 2) {
        char *path = getPath(argv[0]);
        printf("Usage: .%s argument\n",path);
        free(path);
        return 1;
    }

    long int fileSize = getFileSize(argv[1]);
    printf("File size in Bytes is = %ldB\n", fileSize);
    printf("File size in KB is = %.2fK\n", (float)fileSize / 1024.0);

    return 0;
}

size_t my_strrchr(const char *ptr, const char delimiter){
    checkBuffer(ptr);

    size_t i = 0;
    size_t ret = 0;

    while( ptr[i] != '\0' ){
        if ( ptr[++i] == delimiter ){
            ret = i;
        }
    }

    return ret;
}

char *getPath(const char *ptr){
    checkBuffer(ptr);

    size_t i=0;
    size_t ret = my_strrchr(ptr, '/');

    char *pathTmp = malloc( 512 );
    char *pathRet = NULL;

    memset(pathTmp, 0, 512);

    if( pathTmp == NULL){
        printf("Error, malloc.\n");
        exit(EXIT_FAILURE);
    }

    while ( ptr[ret] != '\0'){
        pathTmp[i++] = ptr[ret++];
    }

    pathRet = realloc(pathTmp, i+1);
    pathRet[i] = '\0';

    if(pathRet){
        return pathRet;
    }else{
        return pathTmp;
    }
}

long int getFileSize(const char *ptr){
    checkBuffer(ptr);

    long int fileSize;
    FILE *file;

    file = fopen (ptr , "r" );
    if (file == NULL){
        fputs ("File error",stderr);
        fclose (file);
        exit (1);
    }

    fseek (file , 0 , SEEK_END);
    fileSize = ftell (file);
    rewind (file);
    fclose (file);

    return fileSize;
}

void checkBuffer(const char *ptr){
    if (ptr == NULL ){
        printf("Error, NULL Pointer\n");
        exit(EXIT_FAILURE);
    }

    if ( *ptr == '\0' ){
        printf("Error, the Buffer is Empty\n");
        exit(EXIT_FAILURE);
    }
}

Output1:

tara24@tara24-HP-Pavilion-17-Notebook-PC ~ $ ./program
Usage: ./program argument

Output2:

tara24@tara24-HP-Pavilion-17-Notebook-PC ~ $ ./program my_test_file
File size in Bytes is = 16568B
File size in KB is = 16.2K

DU spune acelasi Lucru:

tara24@tara24-HP-Pavilion-17-Notebook-PC ~ $ du -b my_test_file
16568    my_test_file

Bafta

Editat ultima oară de TARA24. (06 Jan 2017 20:08:16)


Orice decizie pe care esti pe cale sa o iei, gandeste-o de cel putin 3 ori.
Din momentul in care ai luat-o nu mai conteaza de cate ori ai gandit-o.
Fi destept, foloseste ce ti se potriveste nu ce ti se impune.

Offline

 

#7 06 Jan 2017 23:41:46

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 332

Re: Program in C sub Linux

Din pacate problema este mai complexa, poti descarca coreutils

Cod:

apt source coreutils

Dupa care te uiti la du.c care este sursa lui du, trust me nu este asa simplu.


Procesor:GenuineIntel ,Intel(R) Atom(TM) CPU  230   @ 1.60GHz, placa video intel G945,
2GB ram, 160GB hdd.

Offline

 
Feed

Antet forum

Powered by FluxBB