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 29 Dec 2017 11:14:43

utillizator123nec
Membru nou
Înregistrat: 29 Dec 2017
Mesaje: 7

Sters

Mesaj sters

Editat ultima oară de utillizator123nec (15 Jan 2018 18:45:51)

Offline

 

#2 29 Dec 2017 14:16:55

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 462

Re: Sters

Probabil un gui cu o baza de date in spate, cred ca nu este chiar mic programul.
Cred ca o solutie este aici:
https://dev.mysql.com

Editat ultima oară de bula20 (29 Dec 2017 14:20:11)


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

Offline

 

#3 31 Dec 2017 08:30:41

hritcucos
Membru
Înregistrat: 11 Feb 2008
Mesaje: 195

Re: Sters

Eu as recomanda in pascal

Offline

 

#4 03 Jan 2018 14:40:15

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

Re: Sters

utillizator123nec a scris:

Buna ziua, am si eu o problema,am nevoie de un mic program in C,

Eu as incepe cu un struct de genul asta:

Cod:

struct Carti{
    char id_Carte[256];
    char nume_Carte[256];
    char numar_Pagini[256];
    char editura[256];
    char Cereri[256];
    char imprumutata[256];
}dbs;

Pe urma m-as concetra pe mai putina bazaie de cap cu atatea DIEZ-uri si as inlocui:

#1# #Jurnalul unui pusti# #20# #Humanitas# #20# #DA#

cu:

#1#Jurnalul unui pusti#20#Humanitas#20#DA

Si apeland functia strtok mi-ar face munca mult mai usoara din moment ce eu creez database-ul, nu? Dar daca trebuie neaparat sa fie asa te descurci.

Iar daca as avea un fisier numit biblioteca.txt care sa zicem ar avea urmatorul continut:

#1#Jurnalul unui pusti#20#Humanitas#20#DA
#2#Crima si pedeapsa#350#Speranta#5#NU
#3#Tacerea Mieilor#2000#Ubuntu#20#DA
#4#Las fierbinti#5000#TARA24#5#NU

as verifica daca fisierul exista inainte de a ma apuca de el, iar pentru asta as creea o Functie de genul:

Cod:

int verificaFisier( const char *fisier ){
    if( !access( fisier, F_OK ) ){ /* Fisierul exista */
        if( !access( fisier, R_OK ) ){ /* Fisierul poate fi citit */
            if( !access( fisier, W_OK ) ){ /* Fisierul poate fi editat */
                return 0;
            }else{
                printf( "Fisierul %s\t NU poate fi editat | Verifica drepturi Editare.\n",fisier );
                return 1;
            }
        }else{
            printf( "Fisierul %s\t NU poate fi citit | Verifica drepturi Citire.\n",fisier );
            return 1;
        }
    }else{
        printf("Fisierul %s\t NU exista\n",fisier);
        return 1;
    }
}

Deci ar arata cam asa:

Cod:

const char *db = "biblioteca.txt";

if ( verificaFisier( db ) == 0 ){
    /* COD AICI*/
}else{
    perror ( "Probleme cu DB-ul\n" );
}

Acum ca avem cu ce lucra, deci DB-ul biblioteca.txt exista trecem la creerea unei functii care ne citeste intregul fisier intr-un BUFFER:

Cod:

char *afiseazaFisier( const char *fisier ){
    size_t Lungime = 0, marime = 0;
    char *buffer;
    FILE *file;

    file = fopen (fisier , "r" );

    if ( file == NULL ){
        printf( "\n" );
        printf( "\tOOPS %s NU Exista\n", fisier );
        exit( EXIT_FAILURE );
    }

    fseek (file , 0 , SEEK_END);
    Lungime = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc ( Lungime + 1 );

    if (!buffer){
        fputs ("Eroare Malloc",stderr);
        exit( EXIT_FAILURE );
    }

    marime = fread ( buffer, 1, Lungime, file );
    if ( marime != Lungime ){
        fputs ( "Eroare Citire",stderr );
        exit( EXIT_FAILURE );
    }

    buffer[Lungime] = '\0';
    fclose ( file );
    return buffer;
}

Acum le punem cap la cap intr-un Fisier numit db.c si obtinem:

Cod:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int verificaFisier( const char *fisier );
char *afiseazaFisier(const char *fileName );

int main ( void ){
    const char *db = "biblioteca.txt";

    if ( verificaFisier( db ) == 0 ){
        char *ptr = afiseazaFisier( db );
        printf( "%s", ptr );
        free( ptr );
    }else{
        perror ( "Probleme cu DB-ul\n" );
    }

    return 0;
}


int verificaFisier( const char *fisier ){
    if( !access( fisier, F_OK ) ){ /* Fisierul exista */
        if( !access( fisier, R_OK ) ){ /* Fisierul poate fi citit */
            if( !access( fisier, W_OK ) ){ /* Fisierul poate fi editat */
                return 0;
            }else{
                printf( "Fisierul %s\t NU poate fi editat | Verifica drepturi Editare.\n",fisier );
                return 1;
            }
        }else{
            printf( "Fisierul %s\t NU poate fi citit | Verifica drepturi Citire.\n",fisier );
            return 1;
        }
    }else{
        printf("Fisierul %s\t NU exista\n",fisier);
        return 1;
    }
}


char *afiseazaFisier( const char *fisier ){
    size_t Lungime = 0, marime = 0;
    char *buffer;
    FILE *file;

    file = fopen (fisier , "r" );

    if ( file == NULL ){
        printf( "\n" );
        printf( "\tOOPS %s NU Exista\n", fisier );
        exit( EXIT_FAILURE );
    }

    fseek (file , 0 , SEEK_END);
    Lungime = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc ( Lungime + 1 );

    if (!buffer){
        fputs ("Eroare Malloc",stderr);
        exit( EXIT_FAILURE );
    }

    marime = fread ( buffer, 1, Lungime, file );
    if ( marime != Lungime ){
        fputs ( "Eroare Citire",stderr );
        exit( EXIT_FAILURE );
    }

    buffer[Lungime] = '\0';
    fclose ( file );
    return buffer;
}

Compilam cu:

Cod:

gcc -Wpedantic -std=c11 -Wall -Wextra -Werror db.c -o db

Si la rulare obtinem:

tara24@tara24 ~ $ ./db
#1#Jurnalul unui pusti#20#Humanitas#20#DA#
#2#Crima si pedeapsa#350#Speranta#5#NU#
#3#Tacerea Mieilor#2000#Ubuntu#20#DA#
#4#Las fierbinti#5000#TARA24#5#NU#

Doar acum dupa ce neam asigurat ca exista deja cu ce sa lucram doar acum ne apucam de a modifica fisierul sau de a creea alt fisier (imprumutate.txt).


Vorbeam mai sus de strtok uite aici un exemplu:

Cod:

#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int verificaFisier( const char *fisier );
char *afiseazaFisier(const char *fileName );

int main ( void ){
    const char *db = "biblioteca.txt";

    if ( verificaFisier( db ) == 0 ){
        char *ptr = afiseazaFisier( db );
        //printf("%s", ptr);

        char *tmp = strdup( strtok( ptr, "#" ) );
        char *line = tmp;
        size_t count = 0;

        while ( line ){
            printf("Line = %s\n", line);
            line = strtok( NULL, "#" );

            count++;
            if ( count == 6 ){
                printf("Sa terminat Linia\n\n");
                count = 0;
            }
        }
        free ( tmp );
        free( ptr );
    }else{
        perror ( "Probleme cu DB-ul\n" );
    }

    return 0;
}


int verificaFisier( const char *fisier ){
    if( !access( fisier, F_OK ) ){ /* Fisierul exista */
        if( !access( fisier, R_OK ) ){ /* Fisierul poate fi citit */
            if( !access( fisier, W_OK ) ){ /* Fisierul poate fi editat */
                return 0;
            }else{
                printf( "Fisierul %s\t NU poate fi editat | Verifica drepturi Editare.\n",fisier );
                return 1;
            }
        }else{
            printf( "Fisierul %s\t NU poate fi citit | Verifica drepturi Citire.\n",fisier );
            return 1;
        }
    }else{
        printf("Fisierul %s\t NU exista\n",fisier);
        return 1;
    }
}


char *afiseazaFisier( const char *fisier ){
    size_t Lungime = 0, marime = 0;
    char *buffer;
    FILE *file;

    file = fopen (fisier , "r" );

    if ( file == NULL ){
        printf( "\n" );
        printf( "\tOOPS %s NU Exista\n", fisier );
        exit( EXIT_FAILURE );
    }

    fseek (file , 0 , SEEK_END);
    Lungime = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc ( Lungime + 1 );

    if (!buffer){
        fputs ("Eroare Malloc",stderr);
        exit( EXIT_FAILURE );
    }

    marime = fread ( buffer, 1, Lungime, file );
    if ( marime != Lungime ){
        fputs ( "Eroare Citire",stderr );
        exit( EXIT_FAILURE );
    }

    buffer[Lungime] = '\0';
    fclose ( file );
    return buffer;
}

Output:

Line = 1
Line = Jurnalul unui pusti
Line = 20
Line = Humanitas
Line = 20
Line = DA

Sa terminat Linia

Line = 2
Line = Crima si pedeapsa
Line = 350
Line = Speranta
Line = 5
Line = NU

Sa terminat Linia

Line = 3
Line = Tacerea Mieilor
Line = 2000
Line = Ubuntu
Line = 20
Line = DA

Sa terminat Linia

Line = 4
Line = Las fierbinti
Line = 5000
Line = TARA24
Line = 5
Line = NU

Sa terminat Linia

Iar legat de struct, uite un exemplu combinat cu strtok;

Cod:

#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

struct Carti{
    char id_Carte[256];
    char nume_Carte[256];
    char numar_Pagini[256];
    char editura[256];
    char Cereri[256];
    char imprumutata[256];
}dbs;

int verificaFisier( const char *fisier );
char *afiseazaFisier(const char *fileName );
void creazaRecord( const char *src, const size_t count );
void afiseazaRecord( void );

int main ( void ){
    const char *db = "biblioteca.txt";
    const char *carte = "Crima si pedeapsa";

    if ( verificaFisier( db ) == 0 ){
        char *ptr = afiseazaFisier( db );
        char *tmp = strdup( strtok( ptr, "#" ) );
        char *line = tmp;
        size_t count = 0, flag = 0;

        while ( line ){
            creazaRecord ( line, count );
            if ( strcasecmp( line, carte ) == 0 ){
                flag = 1;
            }

            line = strtok( NULL, "#" );
            count++;

            if ( count == 6 ){
                count = 0;
                if ( flag == 1 ){
                    break;
                }
            }
        }
        free ( tmp );
        free( ptr );
    }else{
        perror ( "Probleme cu DB-ul\n" );
    }

    afiseazaRecord();
    return 0;
}


int verificaFisier( const char *fisier ){
    if( !access( fisier, F_OK ) ){ /* Fisierul exista */
        if( !access( fisier, R_OK ) ){ /* Fisierul poate fi citit */
            if( !access( fisier, W_OK ) ){ /* Fisierul poate fi editat */
                return 0;
            }else{
                printf( "Fisierul %s\t NU poate fi editat | Verifica drepturi Editare.\n",fisier );
                return 1;
            }
        }else{
            printf( "Fisierul %s\t NU poate fi citit | Verifica drepturi Citire.\n",fisier );
            return 1;
        }
    }else{
        printf("Fisierul %s\t NU exista\n",fisier);
        return 1;
    }
}


char *afiseazaFisier( const char *fisier ){
    size_t Lungime = 0, marime = 0;
    char *buffer;
    FILE *file;

    file = fopen (fisier , "r" );

    if ( file == NULL ){
        printf( "\n" );
        printf( "\tOOPS %s NU Exista\n", fisier );
        exit( EXIT_FAILURE );
    }

    fseek (file , 0 , SEEK_END);
    Lungime = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc ( Lungime + 1 );

    if (!buffer){
        fputs ("Eroare Malloc",stderr);
        exit( EXIT_FAILURE );
    }

    marime = fread ( buffer, 1, Lungime, file );
    if ( marime != Lungime ){
        fputs ( "Eroare Citire",stderr );
        exit( EXIT_FAILURE );
    }

    buffer[Lungime] = '\0';
    fclose ( file );
    return buffer;
}

void creazaRecord( const char *src, const size_t count ){
    if ( count == 0 ){
        strcpy( dbs.id_Carte, src );
    }

    if ( count == 1 ){
        strcpy( dbs.nume_Carte, src );
    }

    if ( count == 2 ){
        strcpy( dbs.numar_Pagini, src );
    }

    if ( count == 3 ){
        strcpy( dbs.editura, src );
    }

    if ( count == 4 ){
        strcpy( dbs.Cereri, src );
    }

    if ( count == 5 ){
        strcpy( dbs.imprumutata, src);
    }
}

void afiseazaRecord( void ){
    printf( "ID Carte\t= %s\n", dbs.id_Carte );
    printf( "Nume Carte\t= %s\n", dbs.nume_Carte );
    printf( "Numar Pagini\t= %s\n", dbs.numar_Pagini );
    printf( "Editura\t\t= %s\n", dbs.editura );
    printf( "Cereri\t\t= %s\n", dbs.Cereri );
    printf( "Imprumutata\t= %s\n", dbs.imprumutata );
}

Output:

ID Carte    = 2
Nume Carte    = Crima si pedeapsa
Numar Pagini    = 350
Editura        = Speranta
Cereri        = 5
Imprumutata    = NU

Daca mai ai intrebari revin-o.

Toate bune.

Editat ultima oară de TARA24. (03 Jan 2018 16:27:46)


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 03 Jan 2018 16:54:11

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 462

Re: Sters

Ca si sugestie era mai bine daca programul  era impartit in fisiere mai mici si headere, era mai usor de urmarit, iar dbs bagat intr-o alta structura si declarat ca si maxim numar de carti.
Da dbs bagat intr-o structura sa zicem biblioteca cu 199
item si alocat in memorie.

Editat ultima oară de bula20 (03 Jan 2018 16:59:05)


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

Offline

 

#6 04 Jan 2018 17:57:16

utillizator123nec
Membru nou
Înregistrat: 29 Dec 2017
Mesaje: 7

Re: Sters

corect era mai simplu ,dar pt mine nu se poate, asa e problema sunt obligat sa o fac asa cum e, orcum multumesc pt ce ai facut , vad ce pot sa fac eu de aici

Editat ultima oară de utillizator123nec (04 Jan 2018 17:57:38)

Offline

 

#7 04 Jan 2018 18:36:45

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

Re: Sters

utillizator123nec a scris:

corect era mai simplu ,dar pt mine nu se poate

Chiar nu am timpt pentru ce vrei tu, insa uite am eu un proiect mai vechi(ne terminat) care te va ajuta mult.

Bafta.

Editat ultima oară de TARA24. (04 Jan 2018 19:11:50)


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

 

#8 05 Jan 2018 02:57:46

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 462

Re: Sters

Normal era sa faci un pseudocod, dupa care se vedea ce si cum trebuie facut, asa dupa ureche, este mai greu.


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

Offline

 

#9 12 Jan 2018 23:06:10

utillizator123nec
Membru nou
Înregistrat: 29 Dec 2017
Mesaje: 7

Re: Sters

Am revenit , deci am incercat cu structuri dar nu imi afiseaza tot cand gaseste spatiul la numele cartii se opreste si continua cu numarul paginii care e convertit cu atoi si nu merge cum ar trebui sa mut cursorul sa citeasca tot numele
https://imgur.com/a/ckhpf

Offline

 

#10 13 Jan 2018 11:12:37

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

Re: Sters

Arata-ne un cod care sa il compilam si noi sa vedem exact care e problema.

De asemnea si cum arata continutul Fisierului biblioteca.txt


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

 

#11 13 Jan 2018 15:41:55

utillizator123nec
Membru nou
Înregistrat: 29 Dec 2017
Mesaje: 7

Re: Sters

Cod:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct linie {
    int ID_carte;
    char Nume_carte[100];
    int Numar_pagini;
    char Editura[100];
    int Cereri;
    char Imprumutata[100];
}l[500];
void continut_fisier(struct linie l[500]);
void main()
{

    continut_fisier(l);

}

void continut_fisier(struct linie l[500])
{
    FILE *fin = fopen("biblioteca.txt", "r");
    int i = 0, k = 0;
    char lin[500], *p;
    if (fin == NULL)
        printf("EROARE DESCHIDERE FISIER");
    while (!feof(fin))
    {
        fgets(lin, 500, fin);
        p = strtok(lin, "#");
        l[i].ID_carte = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Nume_carte, p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        l[i].Numar_pagini = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Editura, p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        l[i].Cereri = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Imprumutata, p);
        p = strtok(NULL, "#");
        i++;
    }
    for (k = 1; k<i; k++)
        printf("%d %s %d %s %d %s\n", l[k].ID_carte, l[k].Nume_carte, l[k].Numar_pagini, l[k].Editura, l[k].Cereri, l[k].Imprumutata);

}

Nu stiu de ce nu merge, intelesesem ca trb sa fie cva alocat dinamic dar nu imi dau seama cum
biblioteca e in primul mesaj
Ideea e ca atunci cand incerc  ca in l[i].nume_carte sa fac asemeni id sa stochez numele imi sare de la primul spatiu apoi trece la numarul paginii de aceea e 0 cand compilam ca spre exemplu la prima linie la JURNALUL UNUI PUSTI , numele cartii este stocat pana la jurnalul, numarul de pagini stocheaza unui care il converteste in 0 cu atoi apoi mai departe , Ideea e cum fac sa citesc tot numele cartii cu tot cu spatiu,
Nu stiu daca m.am facut bine inteles aia e ideea
Ideea e ca teoretic aici ar trebuie sa imi afiseze continutul fisierului fara # eu nu am cum sa scap de # din fisier nu am voie , si am incercat in felul asta dar nu merge

Editat ultima oară de utillizator123nec (13 Jan 2018 22:02:58)

Offline

 

#12 14 Jan 2018 11:27:30

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 462

Re: Sters

Uite cum sta treaba aici cu alocarea https://en.m.wikipedia.org/wiki/C_dynam … allocation


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

Offline

 

#13 14 Jan 2018 13:32:49

utillizator123nec
Membru nou
Înregistrat: 29 Dec 2017
Mesaje: 7

Re: Sters

stiu dar nu inteleg ce ar trebui sa aloc dinmaic , sau cum ar trebuie sa fac sa sa imi stochez numele cartii , etc . Vreau sa fac cu structuri ca am alte subiecte care se fac greu si structurile  m.ar ajuta

Cod:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct linie {
    int ID_carte;
    char Nume_carte[100];
    int Numar_pagini;
    char Editura[100];
    int Cereri;
    char Imprumutata[100];
}l[50];
void continut_fisier(struct linie l[50]);
void main()
{

    continut_fisier(l);

}

void continut_fisier(struct linie l[50])
{
    FILE *fin = fopen("biblioteca.txt", "r");
    int i = 0, k = 0;
    char lin[500], *p;
    if (fin == NULL)
        printf("EROARE DESCHIDERE FISIER");
    while (!feof(fin))
    {
        fgets(lin, 500, fin);
        p = strtok(lin, "#");
        l[i].ID_carte = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Nume_carte, p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        l[i].Numar_pagini = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Editura, p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        l[i].Cereri = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Imprumutata, p);
        i++;
        if (feof(fin))
            break;
    }
    for (k = 1; k<i; k++)
        printf("%d %s %d %s %d %s\n", l[k].ID_carte, l[k].Nume_carte, l[k].Numar_pagini, l[k].Editura, l[k].Cereri, l[k].Imprumutata);

}

asta e codu final la care am ajuns ca primu era gresit , acu teoretic ar fi trebuit sa imi mearga ca nu imi mai ia spatiu dar imi da eroare ca e fragil codu nuj ce sai fac

Offline

 

#14 14 Jan 2018 16:45:08

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

Re: Sters

utillizator123nec a scris:

stiu dar nu inteleg ce ar trebui sa aloc dinmaic

In principiu cu alocarea dinamica treaba sta cam asa. Daca doresti sa creezi o tabela in care sa pui o anumita informatie insa nu sti cat de mare este acea informatie pe care o vrei atunci cu ajutorul memoriei dinamice poti creea acest lucru care ulterior te ajuta sa faci cea ce ai nevoie si sa o redimensionezi dupa ce ai terminat.

Hai sa luam exemplul urmator in considerare. Tu ai nevoie sa se citeasca de la tastatura un anumit text insa nu sti lungimea lui si te decizi ca lungimea acelui txt sa nu fie mai mare de 256 caractere.
Atunci ai de facut asa:

Cod:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LEN 256

struct Persoana {
    char *nume;
    int *varsta;
};

void creaza ( struct Persoana **date );
void printeaza ( struct Persoana **date );

int main ( void ){
    struct Persoana *date;

    creaza( &date );

    if ( date ){
        free ( date );
    }
}

void creaza ( struct Persoana **date ){
    char *tmp;
    *date = malloc ( sizeof ( struct Persoana ) );
    ( *date )->nume  = malloc ( sizeof ( ( *date )->nume ) * (LEN + 1) );
    if ( ( *date )->nume == NULL ){
        printf( "Eroare Malloc( nume )" );
        exit ( EXIT_FAILURE );
    }

    ( *date )->varsta = malloc ( sizeof( ( *date )->varsta ) * 1);
    if ( ( *date )->varsta == NULL ){
        printf( "Eroare Malloc( varsta )" );
        free ( ( *date )->nume );
        free ( *date );
        exit ( EXIT_FAILURE );
    }


    /* Daca TEXTul este mai lung de 255 caractere este ignorat */
    printf( "Da un nume:> ");
    if ( scanf ( "%255s", (*date)->nume ) != 1 ){
        printf("Eroare Scanf()\n");
        free ( ( *date )->nume );
        free ( ( *date )->varsta );
        free ( *date );
        exit ( EXIT_FAILURE );
    }

    /*  AICI se termina TEXTul  */
    ( *date )->nume[ strlen ( ( *date )->nume ) ] = '\0';

    printf( "Da o varsta:> ");
    if ( scanf ("%d" , &*( *date )->varsta ) != 1 ){
        printf("Eroare Scanf()\n");
        free ( ( *date )->nume );
        free ( ( *date )->varsta );
        free ( *date );
        exit ( EXIT_FAILURE );
    }

    *( *( date ) )->varsta = 35;

    printeaza ( date );

    /* acum vedem daca TEXTul este mai scurt decat LUNGIMEA MAXIMA*/
    size_t lungText = strlen( ( *date )->nume );

    /* Acum se verifica daca TEXTul este mai mic decat LEN */

    if ( lungText < LEN ){
        printf( "LungTxt = %zu\nLEN = %d\n\n", lungText, LEN );

        /* Se micsoreaza memoria alocata */
        tmp = realloc ( ( *date )->nume , sizeof( char ) * ( lungText + 1 ) );
        if ( tmp == NULL ){
            printf("Eroare, Realloc (tmp)");
        }
    }

    if ( tmp ){
        free ( tmp );
    }

    if ( ( *date )->varsta ){
        free ( ( *date )->varsta );
    }
}

void printeaza ( struct Persoana **date ){
    printf( "\nNume   = %s\n", ( *date )->nume );
    printf( "Varsta = %d\n\n", *( *date )->varsta );
}

Output:

Da un nume:> TARA24
Da o varsta:> 35

Nume   = TARA24
Varsta = 35

LungTxt = 6
LEN = 256

Incearca sa intelegi codul si revin-o cu Intrebari.

Editat ultima oară de TARA24. (14 Jan 2018 17:20:18)


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

 

#15 15 Jan 2018 08:09:47

bula20
Membru
Înregistrat: 18 Jan 2016
Mesaje: 462

Re: Sters

Alocarea de memorie este standard in toate programele, este obligatorie nu stam noi sa inventam roata acum.


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

Offline

 

#16 15 Jan 2018 17:55:31

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

Re: Sters

utillizator123nec a scris:

Deci nu prea stiu nici multa informatica , stiu ca pe undeva tot am gresit ca nu imi da  bazaconii , ati putea sa imi spuneti unde mai exact e gresit in codul meu, nu imi dau seama oricat as incerca

Nu ca nu vreau sa te ajut, dar nici munca ta nu o pot face,  insa vreau sa te intreb cateva lucruri.
De unde ti-a venit ideea sa folosesti:
1)

Cod:

#define _CRT_SECURE_NO_WARNINGS

Ca sa ai nevoie de asa ceva (banuiesc ca aveai vre-o functie marcata ca deprecated) trebuie sa cunosti limbajul C, OSul precum si Compilatorul la un nivel la care nu ai ce cauta pe acest Forum.

2)
Sintaxa corecta a lui main este prevazuta de Standardul C doar in 2 variante ca fiind valida:
Varianta 1):

Cod:

int main ( void ) {}

Varianta 2):

Cod:

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

De unde vii tu cu antichitatea asta de void main()? Poate folosesti porcaria aia de VS.
Nu cred ca ai cunostinte despre  Freestanding Environmen sau Hosted Environment:

5.1.2.1 Freestanding environment
1 In a freestanding environment (in which C program execution may take place without any
benefit of an operating system), the name and type of the function called at program
startup are implementation-defined. Any library facilities available to a freestanding
program, other than the minimal set required by clause 4, are implementation-defined.
2 The effect of program termination in a freestanding environment is implementationdefined.

Sau despre Hosted Enviroment;

5.1.2.2 Hosted environment
1 A hosted environment need not be provided, but shall conform to the following
specifications if present.

Clause 4,
4) Strictly conforming programs are intended to be maximally portable among conforming
implementations. Conforming programs may depend upon nonportable features of a conforming
implementation

3)
Asta este cea mai tare...
In codul tau zici la un moment dat asa:

Cod:

p=(char*)malloc(sizeof(char)*1024);

Apoi faci ce faci cu P ala  si pe urma, baam:

Cod:

p=(char*)malloc(sizeof(char)*1024)

Efectiv nu iti mai pasa de Tabela (array-ul) pe care ai ceruto de la Sistemul de Operare si muti Pointerul spre o alta locatie, creeand o alta Tabela (array) 6 linii mai jos:

Cod:

p=(char*)malloc(sizeof(char)*1024);

De parca nu tia ajuns, semnc ca nu sti cea ce faci, dupa alte 6 Linii, cu ajutprul lui p te rogi de OS sa iti mai dea inca 1024 de byte pentru ca tu ai nevoie de 3072:

Cod:

p=(char*)malloc(sizeof(char)*1024);

Cu memoriile Computerului nu te Joci, ce-a ce ai facut tu acolo se numeste memory leak

apoi incerci sa copiezi continutul lui P dupa ce el pointeaza spre o locatie in memorie ne-initializata:

Cod:

strcpy(l[i].Nume_carte, p);

Si acest lucru il faci de 3 ori.

Foarte important de stiut este, ca daca tu ai nevoie de cast (char*) in fata lui malloc spune 2 lucruri:
[*] Nu sti ce returneaza malloc
[*] Nu folosesti un Compilator C

Ce pot sa iti recomand este TutorialPoint.


Bafta

Editat ultima oară de TARA24. (15 Jan 2018 21:51:01)


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

 

#17 17 Jan 2018 20:49:06

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

Re: Sters

utillizator123nec a scris:

Cod:

fgets(lin, 500, fin);
        p = strtok(lin, "#");
        l[i].ID_carte = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Nume_carte, p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        l[i].Numar_pagini = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Editura, p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        l[i].Cereri = atoi(p);
        p = strtok(NULL, "#");
        p = strtok(NULL, "#");
        strcpy(l[i].Imprumutata, p);
        i++;

}

asta e codu final la care am ajuns ca primu era gresit , acu teoretic ar fi trebuit sa imi mearga ca nu imi mai ia spatiu dar imi da eroare ca e fragil codu nuj ce sai fac

Toata nebunia aia nu se face asa, ci asa:

Cod:

while ( line ){
    if ( strcmp( line, " ") == 0 ){
        line = strtok( NULL, "#" );
    }

    line = strtok( NULL, "#" );
}

Observi cat de putin cod este necesar?

In fine, uite aici un cod care iti extrage fiecare linie in parte si afiseaza doar cea ce gaseste intre #<=># si atat pentru ca asta incerci tu acolo defapt:

Cod:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *strdup(const char *str);

int main ( void ){
    char db[] = "#1# #Jurnalul unui pusti# #20# #Humanitas# #20# #DA#"
                "#2# #Crima si pedeapsa# #350# #Speranta# #5# #NU#"
                "#3# #Tacerea Mieilor# #2000# #Ubuntu# #20# #DA#"
                "#4# #Las fierbinti# #5000# #TARA24# #5# #NU#";

    /*char db[] = "#1#Jurnalul unui pusti#20#Humanitas#20#DA"
                "#2#Crima si pedeapsa#350#Speranta#5#NU"
                "#3#Tacerea Mieilor#2000#Ubuntu#20#DA"
                "#4#Las fierbinti#5000#TARA24#5#NU";*/

    char *tmp = strdup( strtok( db, "#" ) );
    char *line = tmp;
    int count = 0;

    while ( line ){
        if ( strcmp( line, " ") == 0 ){
            line = strtok( NULL, "#" );
        }

        printf("Linie = %s\n", line );

        line = strtok( NULL, "#" );
        count++;

        if ( count == 6 ){
            printf("\n==================\n\n");
            count = 0;
        }

    }
    free ( tmp );
    return 0;
}

char *strdup(const char *str){
    size_t n = strlen(str) + 1;
    char *dup = malloc(n);

    if(dup){
        strcpy(dup, str);
    }

    return dup;
}

Output:

1
Jurnalul unui pusti
20
Humanitas
20
DA

==================

2
Crima si pedeapsa
350
Speranta
5
NU

==================

3
Tacerea Mieilor
2000
Ubuntu
20
DA

==================

4
Las fierbinti
5000
TARA24
5
NU

==================

Sfatul meu este sa nu incerci niciodata sa citesti un fisier in timp ce il deschizi. Fa o citire intreaga a acelui Fisier, salveaza-l intr-un Pointer si apoi lucreaza cu acel Pointer.
Ai exemlu mai sus despre cum se citeste si salveaza un Fisier intr-un Pointer. Luceraza cu acea Functie sau una Indentica.

in codul tau folosesti atoi():

Cod:

l[i].ID_carte = atoi(p);

Eu unul nu as mai folosii atoi() pentru ca are foarte multe probleme, a se inlocuii cu strtol() daca insisti sa mergi pe STRUCTul tau:

Cod:

struct linie {
    int ID_carte;
    char Nume_carte[100];
    int Numar_pagini;
    char Editura[100];
    int Cereri;
    char Imprumutata[100];
}l[500];

.

Eu as merge pe char;

Cod:

struct Carti{
    char id_Carte[256];
    char nume_Carte[256];
    char numar_Pagini[256];
    char editura[256];
    char Cereri[256];
    char imprumutata[256];
};

Deoarece este mai usor de lucrat si mai putin COD necesar, insa se poate si ce vrei tu.

Citeste mai multe despre atoi() AICI.

Bafta.

Editat ultima oară de TARA24. (17 Jan 2018 21:48: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

 

Antet forum

Powered by FluxBB