Ir ao conteúdo
  • Cadastre-se

C Trabalhando com arquivos e ponteiros


Lucas Frazão

Posts recomendados

Galera, precisava achar a saída igual da imagem que poste, mas não consigo de jeito nenhum, sempre da erro.Alguém consegue ajudar?

CODE

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

typedef struct{
    char nome[40];
    float salario;
    long admissao_lg;
    char admissao_str[11];
    char departamento[40];

} Funcionario;

struct tm tm;
void args(char* arg[]);  // Chamada (inicia o codigo de fato)
long data(char data[]);  //Chamada (transforma data em long para fazer comparações)
int numero_de_pessoas(char arquivo[]);  // Chamada (Indentifica o numero de pessoas no arquivo de entrada)
void ler_nome(FILE *arq, char nome[40]);  // Chamada (Faz a leitura de nome no arquivo de entrada)
float media(Funcionario funcionario[], int num); // Case 5-6 (Tira a media de uma lista de funcionarios)
int mais_velho(Funcionario funcionario[], int num);  // Case 3-4 (Identifica a posição do fun. mais velho da lista)
int ordem_alfb_func(const void *s1, const void *s2);  // Case 1-2 função de comparação (Comparação por nome de struct)
void ordem_alfb(Funcionario funcionario[], int num);  // Case 1-2 (Ordena a lista de fun.)
void leitura(Funcionario funcionario[], int num, char arquivo[]);  //Chamada (Seta a lista de funcionarios)
Funcionario * dep(Funcionario funcionario[], int *num, char departamento[]); // Case 2 (Gera lista de fun. por derp.)
void print_funcionarios(Funcionario funcionario[], int num, int i,char arquivo[]); // Print e output
Funcionario set_funcionario(char nome[], float salario, char admissao[], char departamento[]);  // Chamada (Inicia fun.)

int main(int argc, char* argv[]){
    if(argc == 0) printf("Nenhum argumento passado");  // Pequena verificação se algum argumento foi passado
    else args(argv);  // Inicia o programa

    return 0;
}

void args(char* arg[]){
    char qst = (char) arg[2][0];  // Salva qual dos casos foi passado no terminal

    int num = numero_de_pessoas(arg[1]);  // Lê o numero de pessoas no arquivo input
    int valor;

    Funcionario funcionario[num];
    Funcionario *temp1;

    leitura(funcionario, num, arg[1]);  // Gera a lista de funcionarios

    switch (qst){
        case '1':  // Gera arquivo output.txt (3º argumento) com os funcionarios em ordem alfabetica
            ordem_alfb(funcionario, num);
            print_funcionarios(funcionario, num, 0, arg[3]);
            break;
        case '2':  // Printa funcionarios de um determinado departamento em ordem alfabetica
            ordem_alfb(funcionario, num);
            temp1 = dep(funcionario, &num, arg[3]);
            print_funcionarios(temp1, num, 1, NULL);
            break;
        case '3':  // Printa o funcionario mais velho
            valor = mais_velho(funcionario, num);
            temp1 = &funcionario[valor];
            print_funcionarios(temp1, 1, 1, NULL);
            break;
        case '4':  // Printa o funcionario mais velho de um departamento
            temp1 = dep(funcionario, &num, arg[3]);
            valor = mais_velho(temp1, num);
            print_funcionarios(&temp1[valor-1], 1, 1, NULL);
            break;
        case '5':  // Printa a media salarial
            printf("R$%.2f\n\n", media(funcionario, num));
            break;
        case '6':  // Printa a media salarial de um departamento
            temp1 = dep(funcionario, &num, arg[3]);
            printf("R$%.2f\n\n", media(temp1, num));
            break;
        default:
            printf("Segundo argumento menor que 1 ou maior que 6\n");
            break;

    }
}

long data(char data[]){

    time_t t;

    strptime(data, "%d/%m/%Y", &tm);  // Gera uma struct tm "data" a partir de uma string

    tm.tm_isdst = -1;
    t = mktime(&tm);  // Gera a partir de tm um numero referente a data

    return t;
}

int numero_de_pessoas(char arquivo[]){
    int num;

    FILE *arq;

    arq = fopen(arquivo, "r");  // Abre o arquivo em formato leitura
    if (arq == NULL) exit(0);

    fscanf(arq, "%d", &num);  // Lê primeira linha com o numero de funcionarios
    fclose(arq);

    return num;
}

void ler_nome(FILE *arq, char nome[40]){
    int count = 0;  // Inicia contador
    char whl;

    fgetc(arq);  // Lê um caracter do arquivo

    // Loop para ler o nome, para quando encontra a quebra de linha
    while (1){
        whl = fgetc(arq);
        if (whl == '\n') break;
        nome[count] = whl;
        count++;
    }
}

float media(Funcionario funcionario[], int num){
    float media = 0; // Inicia a media

    // Loop para ler todos os salarios da lista de uncionarios e somar na media
    int i;
    for ( i = 0; i < num; ++i) {
        media += funcionario[i].salario;
    }

    return media/(float)num;
}

void leitura(Funcionario funcionario[], int num, char arquivo[]){
    FILE *arq;
    arq = fopen(arquivo, "r");  // Abre arquivo em modo leitura

    if (arq == NULL) exit(0);  // Se arquivo não for encontrado, encerra o programa

    fscanf(arq, "%d", &num);

    // Ler as linhas e gera a lista de funcionarios
    int i;
    for ( i = 0; i < num; ++i) {
        char nome[40] = {'\0'};
        float salario = 0;
        char data[40] = {'\0'};
        char setor[40] = {'\0'};

        ler_nome(arq, nome);
        fscanf(arq, "%f", &salario);
        fscanf(arq, "%s", data);
        fscanf(arq, "%s", setor);

        funcionario[i] = set_funcionario(nome, salario, data, setor);
    }

    fclose(arq);  // Fecha o arquivo
}

int mais_velho(Funcionario funcionario[], int num){
    long temp = funcionario[0].admissao_lg;  // Inicia a variavel com a primeira dada de admissão no formato long
    int valor = 1;

    // Conpara com outros da lista e retorna o valor
    int i;
    for (i = 0; i < num; ++i) {
        if(temp > funcionario[i].admissao_lg){
            temp = funcionario[i].admissao_lg;
            valor = i;
        }
    }

    return valor;
}

int ordem_alfb_func(const void *s1, const void *s2){
    // A função recebe dois ponteiros, struct[i] e struct[i+1], a a partir dai faz a comparação que retorna um int

    Funcionario *e1 = (Funcionario *)s1;  // faz o cast de void* para int*
    Funcionario *e2 = (Funcionario *)s2;

    int compNome = strcmp(e1->nome, e2->nome);  // Faz comparação dos nomes

    return compNome;
}

void ordem_alfb(Funcionario funcionario[], int num){
    qsort(funcionario, num, sizeof(Funcionario), ordem_alfb_func);  //Sorting
}

void print_funcionarios(Funcionario funcionario[], int num, int i, char arquivo[]){

    if(i == 0){
        FILE *arq;
        arq = fopen(arquivo, "w");
        int j;
        for (j = 0; j < num; ++j) {
            char temp [200];
            sprintf(temp, "%s\n"
                          "%.2f\n"
                           "%s\n"
                           "%s\n\n",
                           funcionario[j].nome,
                           funcionario[j].salario,
                           funcionario[j].admissao_str,
                           funcionario[j].departamento);

            fprintf(arq,"%s",  temp);
        }

        fclose(arq);
    } else{
        int j;
        for (j = 0; j < num; ++j) {
            printf("%s\n"
                   "%.2f\n"
                   "%s\n"
                   "%s\n\n",
                   funcionario[j].nome,
                   funcionario[j].salario,
                   funcionario[j].admissao_str,
                   funcionario[j].departamento);
        }
    }
}

Funcionario * dep(Funcionario funcionario[], int *num, char departamento[]){
    int valor1, valor2  = 0;
int i;
    for (i = 0; i < *num; ++i) {
        valor1 += strcmp(funcionario[i].departamento, departamento) == 0 ? 1 : 0;
    }

    Funcionario *temp = malloc(sizeof(Funcionario) * valor1); //Alocar memoria para nova lista de funcionarios
     
    for (i = 0; i < *num; ++i) {
        if (strcmp(funcionario[i].departamento, departamento) == 0){
            temp[valor2] = funcionario[i];
            valor2++;
        }
    }

    *num = valor2;

    return temp;
}

Funcionario set_funcionario(char nome[], float salario, char admissao[], char departamento[]){
    Funcionario var;

    strcpy(var.nome, nome);
    var.salario = salario;
    var.admissao_lg = data(admissao);
    strcpy(var.admissao_str, admissao);
    strcpy(var.departamento, departamento);

    return var;
}
 

 

image.png

Link para o comentário
Compartilhar em outros sites

A função que você quer é a número 8:

 

image.thumb.png.7f6e73668ccc7ed5b8fe9ceb5b455513.png

 

você tem um livro? um manual? o IDE que você usa não mostra as funções simplesmente parando o mouse sobre o nome delas no editor?

 

Escreveu o nome errado....

 

Seu IDE não mostra algo assim:
 

image.png.499429685aa8af23a559cd17f8769fb0.png

 

Onde tem os parâmetros tudo com uma cor indicativa e tal? Apenas parando o ponteiro do mouse sobre a função?

 

E se você clica na estrutura com o botão direito não aparece a definição apertando alguma tecla?

 

Algo assim
 

image.png.3c92451742f6a8765107139262a2d7c3.png

 

Você põe o ponteiro sobre tm e aperta o botão direito e vem o menu. Se apertar então F12 vai direto para a definição da estrutura ou da função, mesmo que seja uma função de seu próprio programa, que você declarou e escreveu. Fica tudo indexado. Veja a própria definição de strftime(), a função que você queria usar e escreveu o nome errado com 'p', se você apertar F12 no caso desse IDE aqui:
 

image.png.6c89fc964fc7012a609c925c151515a7.png

 

e a estrutura tm:
 

image.png.d745658ce783d68b5789b7d6eb919fa1.png

 

Imagino que todo IDE moderno faça isso. Se o que você usa não faz apenas mude. 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...