Ir ao conteúdo

Posts recomendados

Postado


Boa noite a todos.

Estou tendo problema em um exercício, onde devo ler o titulo de vários livros separados por "/" e logo ao lado o estoque do livros em 5 lugares diferentes. Depois devo escrever em um novo arquivo txt o nome de cada um sem o estoque, porém na hora de escrever, saem vários caracteres estranhos. Alguém pode me ajudar pff.

O formato do txt original é:  /* LIVRO/ 1 2 3 4 5 

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

#define MAX 127

FILE * openFile(const char * file, const char * mode);
int contaLinhas(FILE *file);
float calculaMedia(FILE * file);

int main (void){
    FILE *entrada = openFile("arquivoOrigem.txt", "r");
    FILE *titulo = openFile("arquivoDestino1.txt", "wb"); //w+ porque caso o arquivo não exista, ele cria o arquivo 
    FILE *estoque = openFile("arquivoDestino2.txt", "wb");

    char bigName[MAX];
    int x = 0;
    int i = 0;
    int numLinhas;
    

    numLinhas = contaLinhas(entrada);

    float *vetorMedias=(float*)malloc((numLinhas)*sizeof(float));
   

    //checar alocacao de memoria
   
    if (vetorMedias ==NULL){
        printf("Erro ao alocar memoria");
        exit(1);
    }
    
    //montando vetor com media de estoque de livros
    while(i < numLinhas){
        vetorMedias[i]=calculaMedia(entrada);
        i++;
    }
    
    char **nomeLivros = (char**)malloc((numLinhas)*sizeof(char));

    if (nomeLivros == NULL){
        printf("Erro ao alocar memoria");
        exit(1);
    }
    
    for(int w =0; w<numLinhas; w++){
        nomeLivros[w] =(char *)malloc((strlen(bigName)+1)*sizeof(char));
        if (nomeLivros[w] == NULL){
            printf("Erro na alocacao dinamica.\n");
            exit(1);
        }
    }
    
    while(x < numLinhas){
        char criaLinha='\0';
        
        fscanf(entrada, "%[^/\n]s", bigName);
        while ((criaLinha!='\n') && (criaLinha !=EOF )){
            criaLinha=fgetc(entrada);
        }
        
        strcpy(nomeLivros[x], bigName);
        x++;
    }    
    
    //criando arquivo com os nomes dos livros dos livros
    for(int n = 0; n<numLinhas; n++){
        fprintf(titulo, "%s \n", nomeLivros[n]);
    }
    
    free(vetorMedias);
    //loop para liberar memoria matriz 
    for(int y = 0; y<numLinhas; y++){
        free(nomeLivros[y]);
    }
    
    fclose(entrada);
    fclose(titulo);
    fclose(estoque);

    
    
    
    return 0;
}

FILE * openFile(const char * file, const char * mode){
    FILE *fp;

    if((fp = fopen(file, mode)) != 0){
        return fp;
    }
    else{
        printf("Erro ao abrir o arquivo\n");
        return NULL;
    }
}

int contaLinhas(FILE *file){                 //contando quantidade de linahs no arquivo
    char c;
    char letra = '\n';                          // define o fim da linha
    int numLinhas = 0;                          //numero de numLinhas no arquivo 

    while(fread (&c, sizeof(char), 1, file)){
        if(c == letra) {                        //se a ultima letra for \n é porque a linha acabou, somando +1
            numLinhas++;                        //numero de linhas
        }
    } 
    numLinhas++;
    return numLinhas;
}

float calculaMedia(FILE * file){   
    char nome[MAX];
    float p1,p2,p3,p4,p5;
    float media;

    fscanf(file," %[^/]/ %f %f %f %f %f",nome,&p1,&p2,&p3,&p4,&p5);
    media = (p1+p2+p3)/5;

    return media;
}

 

  • Obrigado 1
Postado
1 hora atrás, Estalha disse:
FILE * openFile(const char * file, const char * mode);

 

Não entendi para que essa função, que é uma capa para ela mesma. ???? fopen() tem dois parâmetros e retorna um handle, o tal FILE*. Aí você escreveu uma função que faz exatamente a mesma coisa, com os mesmos argumentos,  e chamou de ... openFile()??

 

Também não entendi os especificadores de scanf(). Você pode e deve consumir uma linha por vez.

 

 /* LIVRO/       1  2  3  4  5 
/ outro livro /  1 34  5  6 89
/ livro2 /      12 22 33 44 55 
/ livrox /      21 23 44 55 66

 

A saída:

 

* LIVRO
outro livro
livro2
livrox


 

Se você quer a saída no modo texto escreva como tal. Veja o enunciado... que você não postou.

 

Isso é claro muito vago. Então se pode supor que vai acumular informações sobre os livros em estoque nos vários lugares e mostrar na tela, e ao final gerar um TXT com a simples lista dos livros. Assim você descreveu.

 

 

 

 

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!